From 7cc7d045b507b2e24e2a03fb6d2c77332c647da7 Mon Sep 17 00:00:00 2001 From: groundhog Date: Mon, 11 Sep 2023 00:09:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(NumberUtil):=20parseInt=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=85=88=E5=90=8E=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - https://gitee.com/dromara/hutool/issues/I800C9 - 十六进制中E被误判为科学技术法,修改判断先后处理 --- .../src/main/java/cn/hutool/core/util/NumberUtil.java | 10 +++++----- .../test/java/cn/hutool/core/util/NumberUtilTest.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) 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 33f908261..87040d6cb 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 @@ -2556,16 +2556,16 @@ public class NumberUtil { return 0; } - if(StrUtil.containsIgnoreCase(number, "E")){ - // 科学计数法忽略支持,科学计数法一般用于表示非常小和非常大的数字,这类数字转换为int后精度丢失,没有意义。 - throw new NumberFormatException(StrUtil.format("Unsupported int format: [{}]", number)); - } - if (StrUtil.startWithIgnoreCase(number, "0x")) { // 0x04表示16进制数 return Integer.parseInt(number.substring(2), 16); } + if(StrUtil.containsIgnoreCase(number, "E")){ + // 科学计数法忽略支持,科学计数法一般用于表示非常小和非常大的数字,这类数字转换为int后精度丢失,没有意义。 + throw new NumberFormatException(StrUtil.format("Unsupported int format: [{}]", number)); + } + try { return Integer.parseInt(number); } catch (NumberFormatException e) { 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 f86bf884b..bf69c1603 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 @@ -273,8 +273,8 @@ public class NumberUtilTest { @Test public void parseIntTest() { - int number = NumberUtil.parseInt("0xFF"); - Assert.assertEquals(255, number); + int number = NumberUtil.parseInt("0xFE"); + Assert.assertEquals(254, number); // 0开头 number = NumberUtil.parseInt("010");