我正在尝试确定字符串数组中的特定项是否为整数。
我.split(" ")'ing
是String
形式的中缀表达式,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于操作符,一个用于丢弃括号和其他杂项。实现这一目标的最佳方法是什么?
我以为我可以找到Integer.isInteger(String arg)
方法或其他东西,但没有这样的运气。
答案 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+");
}