我通常使用以下习语来检查String是否可以转换为整数。

public boolean isInteger( String input ) {
    try {
        Integer.parseInt( input );
        return true;
    }
    catch( Exception e ) {
        return false;
    }
}

是我的错觉,还是你觉得这有点粗俗?还有什么更好的办法吗?


看看我的回答(带有基准,基于CodingWithSpike之前的回答),看看为什么我改变了立场,接受了Jonas Klemming对这个问题的回答。我认为大多数人都会使用这个原始代码,因为它实现起来更快,也更易于维护,但是当提供非整数数据时,它就慢了几个数量级。


当前回答

您可以尝试apache utils

NumberUtils.isCreatable(myText)

点击这里查看javadoc

其他回答

你所做的是有效的,但你可能不应该总是这样检查。抛出异常应该为“异常”情况保留(不过,可能适合您的情况),并且在性能方面代价非常高。

你也可以使用Scanner类,并使用hasNextInt() -这也允许你测试其他类型,如浮点数等。

这更短,但更短并不一定更好(它不会捕获超出范围的整数值,正如danatel的评论所指出的那样):

input.matches("^-?\\d+$");

就我个人而言,由于实现被保存在一个helper方法中,并且正确性胜过长度,所以我将使用类似于您所拥有的东西(减去捕获基Exception类而不是NumberFormatException)。

如果你不关心潜在的溢出问题,这个函数将比使用Integer.parseInt()快20-30倍。

public static boolean isInteger(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 < '0' || c > '9') {
            return false;
        }
    }
    return true;
}

这里有几个回答说尝试解析为整数并捕获NumberFormatException,但您不应该这样做。

这种方法将创建异常对象,并在每次调用它时生成堆栈跟踪,而且它不是整数。

Java 8中更好的方法是使用流:

boolean isInteger = returnValue.chars().allMatch(Character::isDigit);