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

确定字符串在Java中是否为整数,java,string,int,Java,String,Int,我试图确定字符串数组中的特定项是否为整数 我正在.split(“””以String的形式使用中缀表达式,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于运算符,同时丢弃括号和其他杂项。实现这一目标的最佳方式是什么 我想我可能能找到一个Integer.isInteger(String arg)方法之类的东西,但没有这样的运气。你想使用这个方法 您可以使用Integer.parseInt()或Integer.valueOf()从字符串中获取整数,并捕获异常(如果它不是可解析的整数)。您要确保

我试图确定字符串数组中的特定项是否为整数

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

我想我可能能找到一个
Integer.isInteger(String arg)
方法之类的东西,但没有这样的运气。

你想使用这个方法


您可以使用
Integer.parseInt()
Integer.valueOf()
从字符串中获取整数,并捕获异常(如果它不是可解析的整数)。您要确保捕获它可以引发的
NumberFormatException


请注意,valueOf()将返回整数对象,而不是原语int。

最简单的方法是迭代字符串,并确保所有元素都是给定基数的有效数字。这是可能达到的效率,因为您必须至少查看每个元素一次。我想我们可以基于基数对其进行微优化,但无论出于何种目的,这都是您所期望的

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;
}
如果最佳实践对您来说无关紧要,或者您想对代码审阅者施加压力,请尝试以下尺寸:

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

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

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}
这可能会更快,尤其是在预编译和重用正则表达式的情况下

但是,这种方法的问题是,如果
str
表示超出合法
int
值范围的数字,则
Integer.parseInt(str)
也将失败。虽然可以创建一个只匹配
Integer.MIN\u INT
Integer.MAX\u INT
范围内整数的正则表达式,但这并不是一个好现象。(我不打算尝试……)


另一方面。。。出于验证目的,可以将“非整数”和“整数太大”分开处理。

或者您可以从Apache Commons的好友那里寻求一些帮助:

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

但是,请注意,如果计算的整数溢出,将引发相同的异常。您的目的是确定它是否为有效整数。因此,使用自己的方法检查有效性更安全:

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;
}
static boolean isInt(String s)//假设整数是十进制数
{
对于(int a=0;a或

mystring.matches(\\d+)


尽管对于大于整数的数字,它会返回true,但使用正则表达式更好

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


-?     --> negative sign, could have none or one
\\d+   --> one or more digits
如果可以使用
if语句
,那么在此处使用
NumberFormatException
是不好的


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

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

为清晰起见进行了编辑。不必厚颜无耻。@krmby目标不是实际检索值,而是确定它是否符合格式。在这方面,Chad是正确的,因为这两种方法都可以很好地工作。@glowcoder你说的是答案的编辑版本,而我不是。我现在两种方法都可以很好地完成工作,但这确实可以不改变以下事实:
Integer.parseInt()
的返回类型是
int
@krmby啊,这是一个有趣的观点。我一直在关注第一段(在复习时,它保持不变。)@这个答案的作者glowcoder说:请注意,这些方法将返回一个整数对象,而不是原语int。我只是说
parseInt()
returns
int
。我对第一段只字未提。Chad La Guardia根据我的评论更正了他的答案,一切都很好。所以我实际上没有理解你的意思。关于这个方法,我唯一的问题是“returning true”。我们的直觉告诉我们,空字符串不是一个数字(OP问题的整数)您可以对执行数学运算,但我想您可以说您无法证明空字符串是非数字的,因为我们还没有告诉您字符串将是什么。我希望这对我来说是一个好答案,但“不仅返回真值,而且还返回“-1”将返回false。这意味着它既不会为所有有效整数返回true,也不会因为返回true而保证将其传递给Integer.parseInt不会引发异常。@jhericks感谢您指出这一点。几年前我第一次回答这个问题时,它引用的是Commons StringUtils的旧版本。此后,他们更新了api,使空字符串现在被视为非数字。不幸的是,否定的情况必须单独处理,这是一个缺点,但解决方法很简单。只需检查numberCandidate.startsWith(“-”)以及一个在parseInt调用后带有否定的子字符串调用,当然假设值是数值。不仅
StringUtils.isNumeric(String)
没有满足检查字符串是否为整数的原始请求但是,为了避免写一个线性套接字,也建议像阿帕奇公馆这样的野兽不是理性的IMHO。只是不惜一切代价避开Apache“Calon”。虽然有时一个好主意一见钟情,但它只是一堆反模式,会给你带来依赖性地狱,因为有争议的结果。“非基于异常的方法”会考虑“-”。作为一个整数。这当然是一种非正统的方法。作为一般规则,您希望避免使用异常来指示执行流。或者正如Joshua Bloch在他的“有效Java项目57:仅在异常情况下使用异常”中所说的那样
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;
}
str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits
str.matches("-?(0|[1-9]\\d*)");
public boolean isInt(String str){
    return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.substring(1).matches(
            "\\d+") : str.matches("\\d+");
}