我正在尝试从属性文件加载信息,我有以下代码:
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)
答案 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