搬运apache-NumberUtils.isCreatable方法及测试用例;

This commit is contained in:
Zjp 2022-11-17 17:24:10 +08:00
parent 50e0426e35
commit 9a1ed650a8
2 changed files with 83 additions and 10 deletions

View File

@ -639,9 +639,10 @@ public class NumberUtil {
* 3科学计数法形式1234E3 * 3科学计数法形式1234E3
* 4类型标识形式123D * 4类型标识形式123D
* 5正负数标识形式+123-234 * 5正负数标识形式+123-234
* 6八进制数字(0开头)
* </pre> * </pre>
* *
* @param str 字符串值 * @param str 字符串值, 不可以含有任何空白字符
* @return 是否为数字 * @return 是否为数字
*/ */
public static boolean isNumber(final CharSequence str) { public static boolean isNumber(final CharSequence str) {
@ -656,8 +657,8 @@ public class NumberUtil {
boolean foundDigit = false; boolean foundDigit = false;
// deal with any possible sign up front // deal with any possible sign up front
final int start = (chars[0] == '-' || chars[0] == '+') ? 1 : 0; final int start = (chars[0] == '-' || chars[0] == '+') ? 1 : 0;
if (sz > start + 1) { if (sz > start + 1 && chars[start] == '0' && !StrUtil.contains(str, CharUtil.DOT)) { // leading 0, skip if is a decimal number
if (chars[start] == '0' && (chars[start + 1] == 'x' || chars[start + 1] == 'X')) { if (chars[start + 1] == 'x' || chars[start + 1] == 'X') { // leading 0x/0X
int i = start + 2; int i = start + 2;
if (i == sz) { if (i == sz) {
return false; // str == "0x" return false; // str == "0x"
@ -670,6 +671,16 @@ public class NumberUtil {
} }
return true; return true;
} }
if (Character.isDigit(chars[start + 1])) {
// leading 0, but not hex, must be octal
int i = start + 1;
for (; i < chars.length; i++) {
if (chars[i] < '0' || chars[i] > '7') {
return false;
}
}
return true;
}
} }
sz--; // don't want to loop to the last char, check it afterwords sz--; // don't want to loop to the last char, check it afterwords
// for type qualifiers // for type qualifiers
@ -730,8 +741,8 @@ public class NumberUtil {
return foundDigit; return foundDigit;
} }
if (chars[i] == 'l' || chars[i] == 'L') { if (chars[i] == 'l' || chars[i] == 'L') {
// not allowing L with an exponent // not allowing L with an exponent or decimal point
return foundDigit && !hasExp; return foundDigit && !hasExp && !hasDecPoint;
} }
// last character is illegal // last character is illegal
return false; return false;

View File

@ -104,11 +104,73 @@ public class NumberUtilTest {
@Test @Test
public void isNumberTest() { public void isNumberTest() {
Assert.assertTrue(NumberUtil.isNumber("28.55")); privateIsNumberTest("28.55", true);
Assert.assertTrue(NumberUtil.isNumber("0")); privateIsNumberTest("12345", true);
Assert.assertTrue(NumberUtil.isNumber("+100.10")); privateIsNumberTest("1234.5", true);
Assert.assertTrue(NumberUtil.isNumber("-22.022")); privateIsNumberTest(".12345", true);
Assert.assertTrue(NumberUtil.isNumber("0X22")); privateIsNumberTest("1234E5", true);
privateIsNumberTest("1234E+5", true);
privateIsNumberTest("1234E-5", true);
privateIsNumberTest("123.4E5", true);
privateIsNumberTest("-1234", true);
privateIsNumberTest("-1234.5", true);
privateIsNumberTest("-.12345", true);
privateIsNumberTest("-1234E5", true);
privateIsNumberTest("0", true);
privateIsNumberTest("0.1", true); // LANG-1216
privateIsNumberTest("-0", true);
privateIsNumberTest("01234", true);
privateIsNumberTest("-01234", true);
privateIsNumberTest("-0xABC123", true);
privateIsNumberTest("-0x0", true);
privateIsNumberTest("123.4E21D", true);
privateIsNumberTest("-221.23F", true);
privateIsNumberTest("22338L", true);
privateIsNumberTest(null, false);
privateIsNumberTest("", false);
privateIsNumberTest(" ", false);
privateIsNumberTest("\r\n\t", false);
privateIsNumberTest("--2.3", false);
privateIsNumberTest(".12.3", false);
privateIsNumberTest("-123E", false);
privateIsNumberTest("-123E+-212", false);
privateIsNumberTest("-123E2.12", false);
privateIsNumberTest("0xGF", false);
privateIsNumberTest("0xFAE-1", false);
privateIsNumberTest(".", false);
privateIsNumberTest("-0ABC123", false);
privateIsNumberTest("123.4E-D", false);
privateIsNumberTest("123.4ED", false);
privateIsNumberTest("1234E5l", false);
privateIsNumberTest("11a", false);
privateIsNumberTest("1a", false);
privateIsNumberTest("a", false);
privateIsNumberTest("11g", false);
privateIsNumberTest("11z", false);
privateIsNumberTest("11def", false);
privateIsNumberTest("11d11", false);
privateIsNumberTest("11 11", false);
privateIsNumberTest(" 1111", false);
privateIsNumberTest("1111 ", false);
privateIsNumberTest("2.", true); // LANG-521
privateIsNumberTest("1.1L", false); // LANG-664
privateIsNumberTest("+0xF", true); // LANG-1645
privateIsNumberTest("+0xFFFFFFFF", true); // LANG-1645
privateIsNumberTest("+0xFFFFFFFFFFFFFFFF", true); // LANG-1645
privateIsNumberTest(".0", true); // LANG-1646
privateIsNumberTest("0.", true); // LANG-1646
privateIsNumberTest("0.D", true); // LANG-1646
privateIsNumberTest("0e1", true); // LANG-1646
privateIsNumberTest("0e1D", true); // LANG-1646
privateIsNumberTest(".D", false); // LANG-1646
privateIsNumberTest(".e10", false); // LANG-1646
privateIsNumberTest(".e10D", false); // LANG-1646
}
private void privateIsNumberTest(final String numStr, final boolean expected) {
Assert.assertEquals(expected, NumberUtil.isNumber(numStr));
} }
@Test @Test