켄타우로스의 String Utils.isNumeric(String str)

10945 단어 StringUtils
프로젝트에서 버그가 발생했습니다. 디버깅 결과는StringUtils입니다.isNumeric(String str)가 장난을 치고 있다(org.apache.commons.lang.String Utils 사용). 다음 코드는 매개 변수가 비어 있지 않고 정수인 것을 판단하는 것이다.
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

유니버설 숫자만 포함, +,-,.셋 다 유니버설 숫자라고 할 수 없어요.

좋은 웹페이지 즐겨찾기