From a22f43c689ba23d1a3b616580e72f403b8638a24 Mon Sep 17 00:00:00 2001 From: Zjp <1215582715@qq.com> Date: Mon, 14 Nov 2022 15:26:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96isInteger=E5=92=8CisLong?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91,=20=E6=94=AF?= =?UTF-8?q?=E6=8C=818=E8=BF=9B=E5=88=B6=E5=92=8C16=E8=BF=9B=E5=88=B6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/math/NumberUtil.java | 47 ++++++++---- .../cn/hutool/core/util/NumberUtilTest.java | 72 ++++++++++++++----- 2 files changed, 91 insertions(+), 28 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java index 9d5152290..8a81f2e29 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java @@ -742,18 +742,28 @@ public class NumberUtil { } /** - * 判断String是否是整数
- * 支持10进制 + * 判断字符串是否是整数 * - * @param s String - * @return 是否为整数 + *

支持格式: + *

    + *
  1. 10进制, 不能包含前导零
  2. + *
  3. 8进制(以0开头)
  4. + *
  5. 16进制(以0x或者0X开头)
  6. + *
+ *

+ * + * @param s 校验的字符串, 只能含有 正负号、数字字符 和 {@literal X/x} + * @return 是否为 {@link Integer}类型 + * @apiNote 6.0.0 支持8进制和16进制 + * @see Integer#decode(String) */ public static boolean isInteger(final String s) { - if (StrUtil.isBlank(s)) { + if (!isNumber(s)) { return false; } try { - Integer.parseInt(s); + //noinspection ResultOfMethodCallIgnored + Integer.decode(s); } catch (final NumberFormatException e) { return false; } @@ -762,18 +772,31 @@ public class NumberUtil { /** * 判断字符串是否是Long类型
- * 支持10进制 * - * @param s String - * @return 是否为{@link Long}类型 + *

支持格式: + *

    + *
  1. 10进制, 不能包含前导零
  2. + *
  3. 8进制(以0开头)
  4. + *
  5. 16进制(以0x或者0X开头)
  6. + *
+ *

+ * + * @param s 校验的字符串, 只能含有 正负号、数字字符、{@literal X/x} 和 后缀{@literal L/l} + * @return 是否为 {@link Long}类型 + * @apiNote 6.0.0 支持8进制和16进制数字 * @since 4.0.0 */ public static boolean isLong(final String s) { - if (StrUtil.isBlank(s)) { + if (!isNumber(s)) { return false; } + final char lastChar = s.charAt(s.length() - 1); + if (lastChar == 'l' || lastChar == 'L') { + return true; + } try { - Long.parseLong(s); + //noinspection ResultOfMethodCallIgnored + Long.decode(s); } catch (final NumberFormatException e) { return false; } @@ -784,7 +807,7 @@ public class NumberUtil { * 判断字符串是否是浮点数 * * @param s String - * @return 是否为{@link Double}类型 + * @return 是否为 {@link Double}类型 */ public static boolean isDouble(final String s) { if (StrUtil.isBlank(s)) { 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 0089c0481..1e69e46e3 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 @@ -80,26 +80,50 @@ public class NumberUtilTest { @Test public void isIntegerTest() { - Assert.assertTrue(NumberUtil.isInteger("-12")); - Assert.assertTrue(NumberUtil.isInteger("256")); - Assert.assertTrue(NumberUtil.isInteger("0256")); - Assert.assertTrue(NumberUtil.isInteger("0")); - Assert.assertFalse(NumberUtil.isInteger("23.4")); - Assert.assertFalse(NumberUtil.isInteger(null)); - Assert.assertFalse(NumberUtil.isInteger("")); - Assert.assertFalse(NumberUtil.isInteger(" ")); + String[] validNumArr = {"0", "-0", "+0", "12", "+12", "1234567890", "2147483647", "-2147483648", + "0x012345678", "0X012345678", "0xabcdef", "-0xabcdef", "0x12abcdef", "0x7FFFFFFF", "-0x80000000", + "01234567", "017777777777", "-020000000000" + }; + privateIsIntegerTest(validNumArr, true); + + String[] invalidNumArr = {null, "", " ", "+", "+1.", ".1", "99L", "99D", "99F", "12.3", "123e1", "-12.3", "1.2.3", + "2147483648", "0x80000000", "020000000000", "-2147483649", "-0x80000001", "-020000000001", "-020000000001", + "a", "+a", "123abc", "09" + }; + privateIsIntegerTest(invalidNumArr, false); + } + + private void privateIsIntegerTest(final String[] numStrArr, final boolean expected) { + for (String numStr : numStrArr) { + Assert.assertEquals("未通过的数字为: " + numStr, expected, NumberUtil.isInteger(numStr)); + } } @Test public void isLongTest() { - Assert.assertTrue(NumberUtil.isLong("-12")); - Assert.assertTrue(NumberUtil.isLong("256")); - Assert.assertTrue(NumberUtil.isLong("0256")); - Assert.assertTrue(NumberUtil.isLong("0")); - Assert.assertFalse(NumberUtil.isLong("23.4")); - Assert.assertFalse(NumberUtil.isLong(null)); - Assert.assertFalse(NumberUtil.isLong("")); - Assert.assertFalse(NumberUtil.isLong(" ")); + String[] validNumArr = { + "0", "0L", "-0L", "+0L", "12", "+12", "1234567890123456789", "99L", + "2147483648", "0x80000000", "020000000000", "-2147483649", "-0x80000001", "-020000000001", "-020000000001", + "9223372036854775807", "-9223372036854775808", + "0x0123456789", "0X0123456789", "0x123456789abcdef", "0xabcdef123456789", "0x7FFFFFFF", "-0x80000000", + "0x7fffffffffffffff", "-0x8000000000000000", + "01234567", "0777777777777777777777", "-01000000000000000000000" + }; + privateIsLongTest(validNumArr, true); + + String[] invalidNumArr = {null, "", " ", "+", "+1.", ".1", "99D", "99F", "12.3", "123e1", "-12.3", "1.2.3", + "a", "+a", "123abc", "09", + "9223372036854775808", "-9223372036854775809", + "0x8000000000000000", "-0x8000000000000001", + "01000000000000000000000", "-01000000000000000000001" + }; + privateIsLongTest(invalidNumArr, false); + } + + private void privateIsLongTest(final String[] numStrArr, final boolean expected) { + for (String numStr : numStrArr) { + Assert.assertEquals("未通过的数字为: " + numStr, expected, NumberUtil.isLong(numStr)); + } } @Test @@ -436,6 +460,22 @@ public class NumberUtilTest { Assert.assertFalse(NumberUtil.isDouble(null)); Assert.assertFalse(NumberUtil.isDouble("")); Assert.assertFalse(NumberUtil.isDouble(" ")); + Assert.assertFalse(NumberUtil.isDouble("1")); + Assert.assertFalse(NumberUtil.isDouble("-1")); + Assert.assertFalse(NumberUtil.isDouble("+1")); + Assert.assertFalse(NumberUtil.isDouble("0.1.")); + Assert.assertFalse(NumberUtil.isDouble("01")); + Assert.assertFalse(NumberUtil.isDouble("NaN")); + Assert.assertFalse(NumberUtil.isDouble("-NaN")); + Assert.assertFalse(NumberUtil.isDouble("-Infinity")); + + Assert.assertTrue(NumberUtil.isDouble("0.")); + Assert.assertTrue(NumberUtil.isDouble("0.1")); + Assert.assertTrue(NumberUtil.isDouble("-0.1")); + Assert.assertTrue(NumberUtil.isDouble("+0.1")); + Assert.assertTrue(NumberUtil.isDouble("0.110")); + Assert.assertTrue(NumberUtil.isDouble("00.1")); + Assert.assertTrue(NumberUtil.isDouble("01.1")); } @Test