【问题标题】:Android parseDouble returns Infinity when it should throw NumberFormatExceptionAndroid parseDouble 在应该抛出 NumberFormatException 时返回 Infinity
【发布时间】:2016-06-15 17:47:27
【问题描述】:

我正在尝试确定 String 是否代表 Double。我希望下面的代码会抛出一个NumberFormatException:

String s = "type1234";

try {
    Double val = Double.parseDouble(s);
} catch (NumberFormatException e) {
    // Handle exception
    e.printStackTrace();
}

相反,valInfinity 结尾。我在标准 JVM 中运行代码,它确实抛出了 NumberFormatException

Android 似乎忽略了前导字符 'typ',然后将其解析为 e^1234,超出了 Double 的范围。

这是预期的行为吗?如果是这样,确定String 是否可以解析为Double 的更可靠方法是什么?

【问题讨论】:

  • 你真的让我好奇.. 是的,它导致Infinity 这似乎是一个明显的错误。 Android 使用 OpenJDK 6?顺便说一句,如果这个理论是正确的,它不会将其解析为 e1234 而是 101234 但相同的想法。
  • 正确,因为科学记数法。例如,1.5e2 = 150。在我的情况下,我猜它正在解析 1e1234,并且由于双精度的最大指数是 1023,它估计它为Infinity

标签: android parsing double


【解决方案1】:

如果您不信任该框架,请使用正则表达式来验证自己。这是执行此操作的一种方法的示例。

    // You can get much fancier than this to handle all cases, but this should handle most
    String regexDouble = "^-?\\d*(\\.\\d+)?$";
    boolean isDouble = val.matches(regexDouble);

【讨论】:

    【解决方案2】:

    Fastest way to check if a String can be parsed to Double in Java

    这篇文章的答案适用于 android。我已经在 ICS 上测试过了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2020-06-12
      • 1970-01-01
      相关资源
      最近更新 更多