确定字符串在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()
returnsint
。我对第一段只字未提。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+");
}