Java中的parseDouble导致NumberFormatException

时间:2011-11-27 13:42:43

标签: java numberformatexception

我正在尝试从属性文件加载信息,我有以下代码:

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 个答案:

答案 0 :(得分:19)

如果要使用Double.parseDouble()进行解析,则必须使用句点作为分隔符,而不是逗号。它在Double类的文档中说

  

FloatingPointLiteral ... [是]在Java语言规范的词汇结构部分中定义。

来自Java语言规范:

  

FloatingPointLiteral:

     
      
  • 数字。数字选择 ExponentPart 选择 FloatTypeSuffix 选择
  •   
  • 。 Digits ExponentPart opt FloatTypeSuffix opt
  •   
  • Digits ExponentPart FloatTypeSuffix opt
  •   
  • Digits ExponentPart opt FloatTypeSuffix
  •   

如果您想考虑区域设置,可以使用java.text.NumberFormat

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

答案 1 :(得分:4)

如果你想使用“,”作为一些欧盟国家使用。你必须仔细照顾你的本地化。

查看java api http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

at 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。换句话说,这意味着它可以影响使用本地化的其他代码。此外,如果您正在使用诸如Servlet容器之类的Containner(例如共享Tomcat托管),它可能会影响同一JVM中的其他应用程序。

大多数情况下,Locale.setDefault()之类的东西可以在本地计算机中使用,但是你不能将它部署在其他服务器上(共享tomcat托管),因为它们的JRE可能被设置为不允许做这样的方法。我很确定大多数优秀的托管服务提供商都是这样做的。如果您可以在任何托管服务提供商的任何共享Tomcats上部署此类代码,我强烈建议您更改为其他托管公司。

答案 2 :(得分:3)

“”。通常用作逗号分隔符。如果您想坚持使用“,”,则必须更改本地化设置:

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

或使用'NumberFormat'类。它的解释非常好int this stackover flow thread