NumberFormatException для Double.valueOf с десятичным разделителем-запятой

Double.valueOf с десятичным разделителем-запятой вызывает исключение NumberFormatException. Java 1.7.0_67 и 1.8.0_25.

Я также пытаюсь установить DecimalFormatSymbols с "," как decimalSeparator.

Locale.setDefault(Locale.FRANCE);
assert "12,3".equals(NumberFormat.getInstance().format(12.3));
if (((DecimalFormat) NumberFormat.getInstance()).getDecimalFormatSymbols().getDecimalSeparator() == ',')
    Double.valueOf("12,3");

person user2618021    schedule 13.02.2015    source источник


Ответы (2)


Double.valueOf() не поддерживает локаль. Он понимает только числа с точками как десятичные разряды.

К счастью, вы можете использовать один и тот же экземпляр NumberFormat для форматирования и синтаксического анализа, который поддерживает локаль....

NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);

System.out.println(format.format(12.3));   // ==> "12,3"
System.out.println(format.parse("12,3"));  // ==> 12.3
person Adam    schedule 13.02.2015

Double.valueOf(String) не учитывает локаль по умолчанию. Обратите внимание, что документация по API метода точно объясняет, какой формат он ожидает. Это также говорит вам об этом:

Чтобы интерпретировать локализованные строковые представления значения с плавающей запятой, используйте подклассы NumberFormat.

Используйте, например, DecimalFormat вместо этого для анализа Струна.

DecimalFormat format = new DecimalFormat("##.#");
Double value = (Double) format.parse("12,3");
person Jesper    schedule 13.02.2015