What's the best way to check if a String represents an integer in Java?

后端 未结 30 1498
野趣味
野趣味 2020-11-22 05:45

I normally use the following idiom to check if a String can be converted to an integer.

public boolean isInteger( String input ) {
    try {
        Integer.         


        
30条回答
  •  旧时难觅i
    2020-11-22 06:30

    I copied the code from rally25rs answer and added some tests for non-integer data. The results are undeniably in favor of the method posted by Jonas Klemming. The results for the Exception method that I originally posted are pretty good when you have integer data, but they're the worst when you don't, while the results for the RegEx solution (that I'll bet a lot of people use) were consistently bad. See Felipe's answer for a compiled regex example, which is much faster.

    public void runTests()
    {
        String big_int = "1234567890";
        String non_int = "1234XY7890";
    
        long startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByException(big_int);
        long endTime = System.currentTimeMillis();
        System.out.print("ByException - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByException(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByException - non-integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByRegex(big_int);
        endTime = System.currentTimeMillis();
        System.out.print("\nByRegex - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByRegex(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByRegex - non-integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByJonas(big_int);
        endTime = System.currentTimeMillis();
        System.out.print("\nByJonas - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
            IsInt_ByJonas(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByJonas - non-integer data: ");
        System.out.println(endTime - startTime);
    }
    
    private boolean IsInt_ByException(String str)
    {
        try
        {
            Integer.parseInt(str);
            return true;
        }
        catch(NumberFormatException nfe)
        {
            return false;
        }
    }
    
    private boolean IsInt_ByRegex(String str)
    {
        return str.matches("^-?\\d+$");
    }
    
    public boolean IsInt_ByJonas(String str)
    {
        if (str == null) {
                return false;
        }
        int length = str.length();
        if (length == 0) {
                return false;
        }
        int i = 0;
        if (str.charAt(0) == '-') {
                if (length == 1) {
                        return false;
                }
                i = 1;
        }
        for (; i < length; i++) {
                char c = str.charAt(i);
                if (c <= '/' || c >= ':') {
                        return false;
                }
        }
        return true;
    }
    

    Results:

    ByException - integer data: 47
    ByException - non-integer data: 547
    
    ByRegex - integer data: 390
    ByRegex - non-integer data: 313
    
    ByJonas - integer data: 0
    ByJonas - non-integer data: 16
    

提交回复
热议问题