mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
搬运apache-NumberUtils.isCreatable方法及测试用例;
This commit is contained in:
parent
50e0426e35
commit
9a1ed650a8
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user