!872 优化NumberUtil.isInteger和isLong的判断逻辑

Merge pull request !872 from emptypoint/update-NumberUtil
This commit is contained in:
Looly 2022-11-24 05:03:28 +00:00 committed by Gitee
commit a1ba1ecf6b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 91 additions and 28 deletions

View File

@ -753,18 +753,28 @@ public class NumberUtil {
} }
/** /**
* 判断String是否是整数<br> * 判断字符串是否是整数
* 支持10进制
* *
* @param s String * <p>支持格式:
* @return 是否为整数 * <ol>
* <li>10进制, 不能包含前导零</li>
* <li>8进制(以0开头)</li>
* <li>16进制(以0x或者0X开头)</li>
* </ol>
* </p>
*
* @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) { public static boolean isInteger(final String s) {
if (StrUtil.isBlank(s)) { if (!isNumber(s)) {
return false; return false;
} }
try { try {
Integer.parseInt(s); //noinspection ResultOfMethodCallIgnored
Integer.decode(s);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
return false; return false;
} }
@ -773,18 +783,31 @@ public class NumberUtil {
/** /**
* 判断字符串是否是Long类型<br> * 判断字符串是否是Long类型<br>
* 支持10进制
* *
* @param s String * <p>支持格式:
* @return 是否为{@link Long}类型 * <ol>
* <li>10进制, 不能包含前导零</li>
* <li>8进制(以0开头)</li>
* <li>16进制(以0x或者0X开头)</li>
* </ol>
* </p>
*
* @param s 校验的字符串, 只能含有 正负号数字字符{@literal X/x} 后缀{@literal L/l}
* @return 是否为 {@link Long}类型
* @apiNote 6.0.0 支持8进制和16进制数字
* @since 4.0.0 * @since 4.0.0
*/ */
public static boolean isLong(final String s) { public static boolean isLong(final String s) {
if (StrUtil.isBlank(s)) { if (!isNumber(s)) {
return false; return false;
} }
final char lastChar = s.charAt(s.length() - 1);
if (lastChar == 'l' || lastChar == 'L') {
return true;
}
try { try {
Long.parseLong(s); //noinspection ResultOfMethodCallIgnored
Long.decode(s);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
return false; return false;
} }
@ -795,7 +818,7 @@ public class NumberUtil {
* 判断字符串是否是浮点数 * 判断字符串是否是浮点数
* *
* @param s String * @param s String
* @return 是否为{@link Double}类型 * @return 是否为 {@link Double}类型
*/ */
public static boolean isDouble(final String s) { public static boolean isDouble(final String s) {
if (StrUtil.isBlank(s)) { if (StrUtil.isBlank(s)) {

View File

@ -80,26 +80,50 @@ public class NumberUtilTest {
@Test @Test
public void isIntegerTest() { public void isIntegerTest() {
Assert.assertTrue(NumberUtil.isInteger("-12")); String[] validNumArr = {"0", "-0", "+0", "12", "+12", "1234567890", "2147483647", "-2147483648",
Assert.assertTrue(NumberUtil.isInteger("256")); "0x012345678", "0X012345678", "0xabcdef", "-0xabcdef", "0x12abcdef", "0x7FFFFFFF", "-0x80000000",
Assert.assertTrue(NumberUtil.isInteger("0256")); "01234567", "017777777777", "-020000000000"
Assert.assertTrue(NumberUtil.isInteger("0")); };
Assert.assertFalse(NumberUtil.isInteger("23.4")); privateIsIntegerTest(validNumArr, true);
Assert.assertFalse(NumberUtil.isInteger(null));
Assert.assertFalse(NumberUtil.isInteger("")); String[] invalidNumArr = {null, "", " ", "+", "+1.", ".1", "99L", "99D", "99F", "12.3", "123e1", "-12.3", "1.2.3",
Assert.assertFalse(NumberUtil.isInteger(" ")); "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 @Test
public void isLongTest() { public void isLongTest() {
Assert.assertTrue(NumberUtil.isLong("-12")); String[] validNumArr = {
Assert.assertTrue(NumberUtil.isLong("256")); "0", "0L", "-0L", "+0L", "12", "+12", "1234567890123456789", "99L",
Assert.assertTrue(NumberUtil.isLong("0256")); "2147483648", "0x80000000", "020000000000", "-2147483649", "-0x80000001", "-020000000001", "-020000000001",
Assert.assertTrue(NumberUtil.isLong("0")); "9223372036854775807", "-9223372036854775808",
Assert.assertFalse(NumberUtil.isLong("23.4")); "0x0123456789", "0X0123456789", "0x123456789abcdef", "0xabcdef123456789", "0x7FFFFFFF", "-0x80000000",
Assert.assertFalse(NumberUtil.isLong(null)); "0x7fffffffffffffff", "-0x8000000000000000",
Assert.assertFalse(NumberUtil.isLong("")); "01234567", "0777777777777777777777", "-01000000000000000000000"
Assert.assertFalse(NumberUtil.isLong(" ")); };
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 @Test
@ -498,6 +522,22 @@ public class NumberUtilTest {
Assert.assertFalse(NumberUtil.isDouble(null)); Assert.assertFalse(NumberUtil.isDouble(null));
Assert.assertFalse(NumberUtil.isDouble("")); Assert.assertFalse(NumberUtil.isDouble(""));
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 @Test