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 是否为整数
+ *
支持格式:
+ *
+ * - 10进制, 不能包含前导零
+ * - 8进制(以0开头)
+ * - 16进制(以0x或者0X开头)
+ *
+ *
+ *
+ * @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}类型
+ * 支持格式:
+ *
+ * - 10进制, 不能包含前导零
+ * - 8进制(以0开头)
+ * - 16进制(以0x或者0X开头)
+ *
+ *
+ *
+ * @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