parseDouble в Java приводит к NumberFormatException - PullRequest
9 голосов
/ 27 ноября 2011

Я пытаюсь загрузить информацию из файла свойств, и у меня есть следующий код:

anInt = Integer.parseInt(prop.getProperty("anInt"));
aDouble = Double.parseDouble(prop.getProperty("aDouble"));

, и хотя первая строка работает нормально, вторая, где я пытаюсь загрузить двойную переменнуюбросает NumberFormatException.Конкретное сообщение об исключении:

Exception in thread "main" java.lang.NumberFormatException: For input string: "78,5"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
at java.lang.Double.parseDouble(Double.java:510)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:59)
at Assignment1.BaseStation.main(BaseStation.java:83)

Ответы [ 3 ]

19 голосов
/ 27 ноября 2011

Вы должны использовать точку в качестве разделителя, а не запятую, если вы хотите проанализировать с помощью Double.parseDouble().В документации для класса Double говорится, что

FloatingPointLiteral ... [is] как определено в разделах лексической структуры Спецификации языка Java.

FromСпецификация языка Java:

FloatingPointLiteral:

  • Цифры.Цифры opt ExponentPart opt FloatTypeSuffix opt
  • .Цифры ExponentPart opt FloatTypeSuffix opt
  • Цифры ExponentPart FloatTypeSuffix opt
  • Цифры ExponentPart opt * 1033SuffyT1034 *

Если вы хотите принять во внимание локаль, вы можете использовать java.text.NumberFormat:

NumberFormat nf = NumberFormat.getInstance();
double number = nf.parse(myString).doubleValue();
4 голосов
/ 27 ноября 2011

Если вы хотите использовать «,», как некоторые страны ЕС используют.Вы должны тщательно позаботиться о вашей локализации.

Посмотрите на Java API http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

на valueOf, он сказал

To interpret localized string representations of a floating-point value, use subclasses of NumberFormat.

Например, этот код будет решатьваша проблема,

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
double number = nf.parse(myString).doubleValue();

Одна важная вещь, вы должны не использовать что-то вроде

Locale.setDefault(something);

, потому что это может повлиять на всю JVM.Другими словами, это означает, что это может повлиять на другие коды, использующие локализацию.Более того, это может повлиять на другие приложения, которые находятся в той же JVM, если вы используете Container, например Servlet Container (например, общий хостинг Tomcat).

И большую часть времени, что-то вроде Locale.setDefault() может использоваться на вашем локальном компьютере, но вы не можете развернуть его на других серверах (общий хостинг tomcat), поскольку для их JRE может быть установлено разрешение, запрещающее такой метод.Я уверен, что большинство хороших хостинг-провайдеров сделали это.Если вы можете развернуть такой код на любом общедоступном Tomcats в любом хостинг-провайдере, я настоятельно рекомендую вам перейти на другую хостинговую компанию.

3 голосов
/ 27 ноября 2011

""обычно используется в качестве разделителя запятых.Если вы хотите придерживаться ",", вам придется изменить настройки локализации:

 Locale.setDefault(Locale.GERMAN);   //German will do the trick, better to use your country code

или использовать класс NumberFormat.Это очень хорошо объяснено в этом потоке потоковых потоков

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...