确定一个字符串是否是一个整数在Java中
我试图确定一个字符串数组中的特定项是否是一个整数。
我是.split(" ")'ing
一个String
形式的中缀表达式,然后试图将结果数组拆分成两个数组; 一个用于整数,一个用于操作员,同时舍弃括号和其他杂项。 什么是最好的方法来完成这个?
我想我可能能找到一个Integer.isInteger(String arg)
方法或其他东西,但没有这样的运气。
最天真的方法是迭代字符串,并确保所有的元素是给定基数的有效数字。 这是可能得到的效率,因为你必须看每个元素至少一次。 我想我们可以根据基数对它进行微观优化,但是对于所有的意图和目的来说,这都是你所期待的。
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; }
使用正则表达式更好。
str.matches("^-?\\d+$"); -? --> negative sign, could have none or one \\d+ --> one or more digits
如果您可以使用if-statement
在这里使用NumberFormatException
并不好。
或者你可以从Apache Commons的好友处获得一些帮助: StringUtils.isNumeric(String str)
或干脆
mystring.matches("\\d+")
尽管对于大于int的数字将返回true
你想要使用Integer.parseInt(String)方法。
try{ int num = Integer.parseInt(str); // is an integer! } catch (NumberFormatException e) { // not an integer! }
作为尝试解析字符串和捕获NumberFormatException
的替代方法,可以使用正则表达式; 例如
if (Pattern.compile("-?[0-9]+").matches(str)) { // its an integer }
这可能会更快,特别是如果您预编译和重用正则表达式。 但是,如果str
表示一个超出合法int
值范围的数字,那么Integer.parseInt(str)
仍然会失败。
你可以使用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; }
您可以使用Integer.parseInt()
或Integer.valueOf()
从字符串中获取整数,如果它不是可分析的int,则捕获该异常。 你想确保捕获它可以抛出的NumberFormatException
。
注意valueOf()会返回一个Integer对象,而不是原始的int。
public boolean isInt(String str){ return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.replace("-", "").matches( "[0-9]+") : str.matches("[0-9]+"); }