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

Posted

技术标签:

【中文标题】带有 EX、EEX、EXP 或 EE 科学记数法的字符串加倍【英文标题】:String with EX, EEX, EXP or EE scientific notation to double 【发布时间】:2019-03-27 14:26:19 【问题描述】:

在我的代码中,我接收来自不同来源的字符串形式的数值。其中一个来源是向我发送这种值:

-6.535402781EX-05

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

我想出了简单的解决方法:

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

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

【问题讨论】:

【参考方案1】:

如果这些是唯一可能的值,您可能希望使用带有正则表达式的 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"));

【讨论】:

您的解决方案似乎比@david 的解决方案更容易。我喜欢正则表达式,在这种情况下它是最小的。谢谢!【参考方案2】:

一个简单的正则表达式对你有用吗?您可以先将不同的输入格式转换为您已知的可由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, "$1$2$3$4E-$6")));

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

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

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

【讨论】:

以上是关于带有 EX、EEX、EXP 或 EE 科学记数法的字符串加倍的主要内容,如果未能解决你的问题,请参考以下文章

20155216 Exp2 后门原理与实践

Magento EE 1.9 的缓存:我们应该使用整页缓存(带有打孔)和/或“经典”块缓存吗?

使用 0 值指数或尾随 0 使科学计数法无效

如何强制 VSCode 的 Tailwind CSS IntelliSense 扩展与 .html.eex 和 .html.leex 文件一起使用?

lua学习 4

带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序