diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 8c345ec0e6..0ba07f3f74 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2783,6 +2783,16 @@ public class NumberUtil { // issue@4197@Github 转为半角 numberStr = Convert.toDBC(numberStr); + // issue#IDJ1NS@Gitee 处理科学计数法E+格式 + // NumberFormat对E+格式支持不佳,使用BigDecimal直接解析 + if (numberStr.contains("E") || numberStr.contains("e")) { + try { + return new BigDecimal(numberStr); + } catch (NumberFormatException e) { + // BigDecimal解析失败,继续使用NumberFormat尝试 + } + } + try { final NumberFormat format = NumberFormat.getInstance(); if (format instanceof DecimalFormat) { diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 8205e574fa..49ea24aaef 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -388,6 +388,17 @@ public class NumberUtilTest { } + @Test + public void parseNumberTest5() { + String numberstr1 = "8.37095942E+9"; + Number result1 = NumberUtil.parseNumber(numberstr1); + // 转换成BigDecimal再输出完整数字 + System.out.println(((BigDecimal) result1).toPlainString()); + String numberstr2 = "8.37095942e+9"; + Number result2 = NumberUtil.parseNumber(numberstr2); + System.out.println(((BigDecimal) result2).toPlainString()); + } + @Test public void parseHexNumberTest() { // 千位分隔符去掉