确定String是否是Java中的整数

时间:2011-03-26 00:31:28

标签: java string int

我正在尝试确定字符串数组中的特定项是否为整数。

.split(" ")'ingString形式的中缀表达式,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于操作符,一个用于丢弃括号和其他杂项。实现这一目标的最佳方法是什么?

我以为我可以找到Integer.isInteger(String arg)方法或其他东西,但没有这样的运气。

9 个答案:

答案 0 :(得分:320)

最天真的方法是遍历String并确保所有元素都是给定基数的有效数字。这几乎和它可能获得的效率一样高,因为你必须至少查看一次每个元素。我想我们可以根据基数对它进行微观优化,但是对于所有意图和目的来说,这都是你期望获得的。

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

或者,您可以依赖Java库来实现此目的。它不是基于异常的,并且可以捕获您能想到的每个错误情况。它会有点贵(你必须创建一个Scanner对象,它在一个你不想做的非常紧凑的循环中。但它通常不应该太昂贵,所以对于日常操作应该非常可靠。

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

如果最佳做法对您无关紧要,或者您想要对进行代码审核的人进行欺骗,请尝试使用以下尺寸:

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}

答案 1 :(得分:227)

使用正则表达式更好。

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

如果您可以使用NumberFormatException,那么在此处使用if-statement并不好。


如果你不想要前导零,你可以使用正则表达式如下:

str.matches("-?(0|[1-9]\\d*)");

答案 2 :(得分:132)

或者你可以在Apache Commons的朋友那里寻求一些帮助:StringUtils.isNumeric(String str)

答案 3 :(得分:66)

或者只是

mystring.matches("\\d+")

虽然对于大于int的数字它会返回true

答案 4 :(得分:49)

您想使用Integer.parseInt(String)方法。

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}

答案 5 :(得分:13)

作为尝试解析字符串并捕获NumberFormatException的替代方法,您可以使用正则表达式; e.g。

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

这可能会更快,特别是如果您预编译并重用正则表达式。但是,如果Integer.parseInt(str)表示超出合法str值范围的数字,则int仍会失败。

答案 6 :(得分:8)

如果字符串不是有效整数,您可以使用Integer.parseInt(str)并捕获NumberFormatException,方式如下(所有答案都指出):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

但是,请注意,如果计算的整数溢出,则会抛出相同的异常。你的目的是找出它是否是一个有效的整数。因此,使用自己的方法检查有效性会更安全:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}

答案 7 :(得分:1)

您可以使用Integer.parseInt()Integer.valueOf()从字符串中获取整数,如果它不是可解析的int,则捕获异常。你想确保抓住它可以抛出的NumberFormatException

值得注意的是,valueOf()将返回一个Integer对象,而不是原始int。

答案 8 :(得分:-1)

public boolean isInt(String str){
    return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.substring(1).matches(
            "\\d+") : str.matches("\\d+");
}