用 EX、EEX、EXP 或 EE 科学记数法加倍的字符串

String with EX, EEX, EXP or EE scientific notation to double

在我的代码中,我从不同来源接收数值作为字符串。消息来源之一向我发送了这种值:

-6.535402781EX-05

经过几次测试我知道 EX 格式不被 Double.valueOf() 方法处理。 NumberFormatException 被抛出。

我找到了简单的解决方法:

 String val = "-6.535402781EX-05".replace("X", ""); 

实际上它正在运行,但我不确定这是否是最佳解决方案。我还看到了 EEXEEEXP。问题:如何针对这种边缘情况保护我的代码?

一个简单的正则表达式是否适合您?您可以先将不同的输入格式转换为可以由 Double.valueOf().

处理的已知输入格式
String pattern = "(\D?)(\d+)(\.?)(\d+)(\D+)(\d+)";

List<String> inputs = Arrays.asList("-6.535402781EX-05", 
                                    "-6.535402781EXP-05", 
                                    "-6.535402781EE-05", 
                                    "-6.535402781E-05", 
                                    "6.535402781E-05",
                                    "6.535402781",
                                    "-6.535402781",
                                    "6.5",
                                    "6");

inputs.forEach((String in) -> System.out.println(in.replaceAll(pattern, "E-")));

我示例中的输入应转换为以下内容,并且应该可以使用 Double.valueOf() 解析它们。

-6.535402781E-05
-6.535402781E-05
-6.535402781E-05
-6.535402781E-05
6.535402781E-05
6.535402781
-6.535402781
6.5
6

您应该小心地为您想要支持的所有输入格式添加足够的单元测试用例。

如果这些是唯一可能的值,您可能希望将 replaceAll 与正则表达式一起使用而不是 replace

String[] val  = {"-6.535402781EX-05","-6.535402781EEX-05","-6.535402781EE-05","-6.535402781EXP-05"};
for(String v :val){
    System.out.println(v.replaceAll("[EXP]{2,}", "E"));
}