【问题标题】:parseDouble in Java results to NumberFormatExceptionJava 中的 parseDouble 结果为 NumberFormatException
【发布时间】:2017-11-27 04:56: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)

【问题讨论】:

  • prop.getProperty("aDouble") 的值是多少?
  • 它必须是 而不是 ,
  • 请下次也给出异常的信息,以便我们更容易看出问题所在。
  • 我将 , 更改为 .它仍然抛出相同的异常
  • prop.getProperty("anInt") 和堆栈跟踪与错误无关

标签: java numberformatexception


【解决方案1】:

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

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

来自 Java 语言规范:

FloatingPointLiteral:

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

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

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

【讨论】:

  • 不!这取决于本地化。
  • Double.parseDouble() 使用 Java 语言中的定义。 Java 中的浮点字面量必须使用句点,而不是逗号。
  • Hovercraft 是正确的 - 如果您注意本地化设置,则使用逗号作为分隔符的值将被正确解析。
  • @mort Double.parseDouble() 不考虑语言环境,你必须使用其他方法来做到这一点。我已经引用过文档了,不信的可以翻看源码。
  • @malcolm:我将逗号更改为句点,但问题似乎是当我将 prop.getProperty 调用到包含双精度值(例如 42.5)的行时,它返回一个空指针而不是一个字符串“42.5”。有什么想法吗?
【解决方案2】:

如果您想像某些欧盟国家使用的那样使用“,”。您必须小心处理本地化。

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

【讨论】:

    【解决方案3】:

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

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

    或使用“NumberFormat”类。解释的真好int this stackover flow thread

    【讨论】:

    • 警告,如果您更改 Locale.setDefault() 它可能会影响整个 JVM。然后,如果您使用像 servlet 容器这样的容器,则必须了解您的应用程序(与本地化相关的代码)和其他应用程序。
    • 没错,最好使用'NumberFormat'。
    • -1: Locale.setDefault() 不会影响Double.parseDouble(),因为它没有考虑语言环境。我在回答中引用了文档,从 OpenJDK 源代码中很明显,而且我刚刚在我的机器上检查过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多