【问题标题】:Parsing String to Double including scientific notation E将字符串解析为 Double,包括科学记数法 E
【发布时间】:2014-05-23 15:01:17
【问题描述】:

我使用Choco 约束求解器来解决问题。
我使用RealVariables xyz
解决方案是这样的

x[3.9999999999999996, 4.000000000000001]
y[-3.1434555694057773E-162, 3.1434555694057773E-162]
z[-3.1434555694057773E-162, 3.1434555694057773E-162]

我尝试将解决方案解析为双变量。

这是我的代码:

String X = s.getVar(x).toString();
String Y = s.getVar(y).toString();
String Z = s.getVar(z).toString();

Matcher match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(X);
while(match.find())
{
     double d = Double.parseDouble(match.group());
     System.out.println("value= " + d);
}
match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(Y);
while(match.find())
{
     DecimalFormat format = new DecimalFormat("0.00"); 
     Double d = Double.parseDouble(match.group());
     System.out.println("value= " + format.format(d));
}
match = Pattern.compile("-?\\d+(\\.\\d+)?").matcher(Z);
while(match.find())
{
     double d = Double.parseDouble(match.group());
     System.out.println("parsed: " + d);
}

输出是:

parsed: 3.9999999999999996
parsed: 4.000000000000001
parsed: -3,14
parsed: -162,00
parsed: 3,14
parsed: -162,00
parsed: -3.143455569405777
parsed: -162.0
parsed: 3.143455569405777
parsed: -162.0

这意味着,-162 被解析为另一个双精度。我该如何防止这种情况?如何使用科学计数法将String 解析为Double

这是因为E-162 对于Double 来说太长了吗?

【问题讨论】:

  • E 与您的正则表达式不匹配,因此它会在 yz 上找到 4 个匹配项。您需要考虑到该号码可能有一个E

标签: java regex parsing


【解决方案1】:

您需要更改模式以考虑指数:

Matcher match = Pattern.compile("-?\\d+(\\.\\d+)?(E-?\\d+)?").matcher(X);

注意:这里不需要捕获组,您可以将它们替换为非捕获组(?:...)

由于您将多次使用相同的正则表达式,因此最好一劳永逸地定义模式,而不是重复Pattern.compile("-?\\d+(\\.\\d+)?(E-?\\d+)?")。你可以使用这个:

static Pattern pattern = Pattern.compile("-?\\d+(?:\\.\\d+)?(?:E-?\\d+)?");
....
Matcher match = pattern.matcher(X);
....
match = pattern.matcher(Y);
....
match = pattern.matcher(Z);

【讨论】:

    【解决方案2】:

    Double#parseDoubleStrings 解析 doubles 并且它也解析指数。

    System.out.println(Double.parseDouble("1.2345e5"));

    --> 123450.0

    示例:https://ideone.com/ACTVQT

    【讨论】:

      【解决方案3】:

      要从正则表达式中捕获 Java 中的所有数字,请使用此模式

      "-?\\d+(\\.\\d+)?(E-?\\d+)?(E\\+?\\d+)?(E?\\d+)?(e-?\\d+)?(e\\+?\\d+)?(e?\\d+)?"
      

      我已经在以下字符串上尝试了这个正则表达式,所有字符串都返回了true

      "2546546516",
      "-2546546516",
      "2546546516.1241546",
      "-2546546516.415441",
      "2.5465E+09",
      "-2.5465E+09",
      "2.5465E-09",
      "-2.5465E-09",
      "2.5465e+09",
      "-2.5465e+09",
      "2.5465e-09",
      "-2.5465e-09",
      "445.4e2",
      "-445.4e2"
      

      注意:这个答案的灵感来自于 Casimir 的回答

      PS。欢迎修改

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 2023-02-21
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多