11

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

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)
4

3 回答 3

20

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

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

来自 Java 语言规范:

浮点字面量:

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

如果要考虑语言环境,可以使用java.text.NumberFormat

NumberFormat nf = NumberFormat.getInstance();
double number = nf.parse(myString).doubleValue();
于 2011-11-27T13:47:14.323 回答
4

如果您想像某些欧盟国家使用的那样使用“,”。您必须仔细照顾您的本地化。

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

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

于 2011-11-27T13:50:13.280 回答
3

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

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

或使用“NumberFormat”类。在这个stackover流线程中解释得非常好

于 2011-11-27T13:49:04.037 回答