From 5d44fc1cc1f9451ca18bf89d38e48f259dce2f62 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 12 Jan 2026 16:08:26 +0800 Subject: [PATCH] =?UTF-8?q?`NumberUtil.parseNumber`=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=A7=91=E5=AD=A6=E8=AE=A1=E6=95=B0=E6=B3=95?= =?UTF-8?q?=EF=BC=88pr#4211@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/v7/core/math/NumberParser.java | 13 ++++++++++++- .../java/cn/hutool/v7/core/math/NumberUtilTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java b/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java index 07f7324cfe..af1cff0bda 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java @@ -21,6 +21,7 @@ import cn.hutool.v7.core.convert.ConvertUtil; import cn.hutool.v7.core.text.CharUtil; import cn.hutool.v7.core.text.StrUtil; +import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; import java.text.NumberFormat; @@ -40,7 +41,7 @@ import java.util.Locale; * *

* 构造时可选是否将NaN转为0,默认为true。
- * 参考:https://stackoverflow.com/questions/5876369/why-does-casting-double-nan-to-int-not-throw-an-exception-in-java + * 参考:why-does-casting-double-nan-to-int-not-throw-an-exception-in-java *

* * @author Looly @@ -374,6 +375,16 @@ public class NumberParser { // issue@4197@Github 转为半角 numberStr = ConvertUtil.toDBC(numberStr); + // issue#IDJ1NS@Gitee 处理科学计数法E+格式 + // NumberFormat对E+格式支持不佳,使用BigDecimal直接解析 + if (StrUtil.containsIgnoreCase(numberStr, "e")) { + try { + return new BigDecimal(numberStr); + } catch (final NumberFormatException e) { + // BigDecimal解析失败,继续使用NumberFormat尝试 + } + } + try { final NumberFormat format = NumberFormat.getInstance(locale); if (format instanceof DecimalFormat) { diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java index de813d60c8..dea7c5eb8a 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java @@ -528,6 +528,16 @@ public class NumberUtilTest { } + @Test + void issueIDJ1NSTest(){ + final String numberstr1 = "8.37095942E+9"; + final BigDecimal result1 = (BigDecimal) NumberUtil.parseNumber(numberstr1); + final String numberstr2 = "8.37095942e+9"; + final BigDecimal result2 = (BigDecimal) NumberUtil.parseNumber(numberstr2); + assertEquals(new BigDecimal("8370959420").toPlainString(), result1.toPlainString()); + assertEquals(new BigDecimal("8370959420").toPlainString(), result2.toPlainString()); + } + @Test public void parseHexNumberTest() { // 千位分隔符去掉