켄타우로스의 String Utils.isNumeric(String str)
10945 단어 StringUtils
if(StringUtils.isNumeric(str) && StringUtils.isNotBlank(str)){
// do sth
}
간단한 코드에 버그가 숨겨져 있다!
만약str="-1";StringUtils.isNumeric(str)가 false를 반환합니다.참으로 애비가 목숨을 갚지 않는구나.
다음은 테스트입니다.
public static void main(String[] args)
{
System.out.println(StringUtils.isNumeric("-1"));
}
실행 결과:false
켄타우로스죠?정규 표현식으로 실현하는 것은 매우 간단하지 않습니까?이럴 수가, 원본 코드를 봤는데:
public static boolean isNumeric(String str) {
if (str == null) {
return false;
}
int sz = str.length();
for (int i = 0; i < sz; i++) {
if (Character.isDigit(str.charAt(i)) == false) {
return false;
}
}
return true;
}
계속 뛰어들기:
public static boolean isDigit(char ch) {
return isDigit((int)ch);
}
계속:
public static boolean isDigit(int codePoint) {
boolean bDigit = false;
if (codePoint >= MIN_CODE_POINT && codePoint <= FAST_PATH_MAX) {
bDigit = CharacterDataLatin1.isDigit(codePoint);
} else {
int plane = getPlane(codePoint);
switch(plane) {
case(0):
bDigit = CharacterData00.isDigit(codePoint);
break;
case(1):
bDigit = CharacterData01.isDigit(codePoint);
break;
case(2):
bDigit = CharacterData02.isDigit(codePoint);
break;
case(3): // Undefined
case(4): // Undefined
case(5): // Undefined
case(6): // Undefined
case(7): // Undefined
case(8): // Undefined
case(9): // Undefined
case(10): // Undefined
case(11): // Undefined
case(12): // Undefined
case(13): // Undefined
bDigit = CharacterDataUndefined.isDigit(codePoint);
break;
case(14):
bDigit = CharacterData0E.isDigit(codePoint);
break;
case(15): // Private Use
case(16): // Private Use
bDigit = CharacterDataPrivateUse.isDigit(codePoint);
break;
default:
// the argument's plane is invalid, and thus is an invalid codepoint
// bDigit remains false;
break;
}
}
return bDigit;
}
다음 단계에서 장애가 발생했습니다.
static boolean isDigit(int ch) {
int type = getType(ch);
return (type == Character.DECIMAL_DIGIT_NUMBER);
}
그러니까 그의 실현은 전혀 고려하지 않았다는 거야. - + 접두사 문제, 이거 바보 아니야?
다음 결과는 모두false:
public static void main(String[] args)
{
System.out.println(StringUtils.isNumeric("-1"));
System.out.println(StringUtils.isNumeric("+1"));
}
이것은 그의 방법에 대한 주석이다.
Checks if the String contains only unicode digits. A decimal point is not a unicode digit and returns false.
null will return false. An empty String ("") will return true.
StringUtils.isNumeric(null) = false
StringUtils.isNumeric("") = true
StringUtils.isNumeric(" ") = false
StringUtils.isNumeric("123") = true
StringUtils.isNumeric("12 3") = false
StringUtils.isNumeric("ab2c") = false
StringUtils.isNumeric("12-3") = false
StringUtils.isNumeric("12.3") = false
Parameters:
str the String to check, may be null
Returns:
true if only contains digits, and is non-null
유니버설 숫자만 포함, +,-,.셋 다 유니버설 숫자라고 할 수 없어요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
켄타우로스의 String Utils.isNumeric(String str)프로젝트에서 버그가 발생했습니다. 디버깅 결과는StringUtils입니다.isNumeric(String str)가 장난을 치고 있다(org.apache.commons.lang.String Utils 사용). 다음 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.