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流程线程中得到了很好的解释