Java中的parseDouble导致NumberFormatException

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

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

虽然第一行工作正常,我试图加载双变量的第二行抛出NumberFormatException 。 具体的exception消息是:

 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) 

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

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

来自Java语言规范:

FloatingPointLiteral:

  • 数字。 Digits opt ExponentPart opt FloatTypeSuffix opt
  • 。 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(); 

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

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

在价值,它说

 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上部署此类代码,我强烈建议您更改为其他托管公司。

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

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

或使用’NumberFormat’类。 它在这个stackover流程线程中得到了很好的解释