确定字符串在 Java 中是否为整数

2022-08-31 04:56:58

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

我正在以形式设置一个中缀表达式,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于运算符,同时丢弃括号和其他杂项。实现这一目标的最佳方法是什么?.split(" ")String

我想我也许能找到一种方法或别的什么,但没有这样的运气。Integer.isInteger(String arg)


答案 1

最幼稚的方法是循环访问 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库来实现这一点。它不是基于异常的,并且会捕获您能想到的几乎所有错误条件。这将有点昂贵(你必须创建一个扫描仪对象,在一个你不想做的非常紧密的循环中。但它通常不应该太昂贵,因此对于日常操作,它应该非常可靠。

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;
}

答案 2

使用正则表达式更好。

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


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

如果可以改用,在这里使用是不好的。NumberFormatExceptionif-statement


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

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