Расширение: Генераторы производят запятую вместо точки

Я использую шаблонные выражения для создания файлов. Например:

def generateStuff(MyObject in) {
    '''
    This is the wrong value: «calculatedoubleValue(in.doubleValue)»
    '''
}

Значение doubleValue равно double. Но генератор выдает запятую вместо точки, как разделитель.

Я также пытался использовать DecimalFormat, например:

def generateStuff(MyObject in) {
    var df = new DecimalFormat("0.000");
    var calculated = calculatedoubleValue(in.doubleValue)
    '''
    This is the wrong value: «df.format(calculated)»
    '''
}

Но, к сожалению, он по-прежнему производит запятую. Интересно, потому что это происходит только с несколькими значениями, а не со всеми, хотя я работаю только с doubles. Еще одна странность заключается в том, что он выдает точки при отладке (приложение Eclipse во время выполнения), но запятые после того, как я экспортирую приложение как продукт Eclipse.

Что может быть причиной этого?


person John    schedule 23.02.2016    source источник


Ответы (2)


В выражениях шаблона toString() вызывается для любых значений (см. StringConcatenation). Double.toString всегда будет использовать '.', поэтому проблема должна быть где-то еще. Может быть, проблема в вашем методе «calculatedDouble»?

person Sven Efftinge    schedule 23.02.2016
comment
Свен, большое спасибо за быстрый ответ. Интересно, почему это работает во время отладки (выполнение приложения Eclipse), но не после экспорта продукта Eclipse. Есть идеи? - person John; 23.02.2016

Хотя у меня мало информации о вашей среде, на основе вашего примера кода вы не используете напрямую Double.toString() (который всегда использует . в качестве десятичного разделителя), а DecimalFormat который чувствителен к локали.

Когда DecimalFormat создается с использованием DecimalFormat(String), будет использоваться "локаль формата" по умолчанию. В некоторых локалях десятичный разделитель равен . (например, в английском языке), но в других локалях это , (например, в венгерском языке). Дополнительные сведения см. в документации по API.

Предлагаемые варианты решения вашей проблемы:

  • Убедитесь, что приложение использует одну и ту же локаль в каждом случае.
  • Явно задайте параметры форматирования для конкретной локали.

Реальный код:

@Test
public void testDecimalFormat() {
    assertEquals("0.000", new DecimalFormat("0.000", new DecimalFormatSymbols(Locale.ENGLISH)).format(0.0));
    assertEquals("0,000", new DecimalFormat("0.000", new DecimalFormatSymbols(new Locale("hu"))).format(0.0));
}
person snorbi    schedule 24.02.2016