在解析字符串之前,如何检查字符串是否为数字?
java 字符串 数字
使用Apache Commons Lang 3.5及更高版本:NumberUtils.isCreatable或StringUtils.isNumeric。
Apache Commons Lang 3.5
NumberUtils.isCreatable
StringUtils.isNumeric
使用Apache Commons Lang 3.4及以下版本:NumberUtils.isNumber或StringUtils.isNumeric。
NumberUtils.isNumber
你还可以使用StringUtils.isNumericSpacewhich返回true空字符串,并忽略字符串中的内部空格。另一种方法是使用NumberUtils.isParsable根据Java基本检查数字是否可解析的方法。(链接的javadocs包含每种方法的详细示例。)
StringUtils.isNumericSpacewhich
NumberUtils.isParsable
通常,这是通过简单的用户定义函数(即,自带的“ isNumeric”函数)完成的。
就像是:
public static boolean isNumeric(String str) { try { Double.parseDouble(str); return true; } catch(NumberFormatException e){ return false; } }
但是,如果你要多次调用此函数,并且希望许多检查由于不为数字而失败,则该机制的性能将不佳,因为你依赖于每次失败都引发异常,这是一个相当昂贵的操作。
一种替代方法是使用正则表达式检查作为数字的有效性:
public static boolean isNumeric(String str) { return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional '-' and decimal. }
但是,请谨慎使用上述RegEx机制,因为如果你使用非阿拉伯数字(即0到9以外的数字),它将失败。这是因为RegEx的“ \ d”部分仅与[0-9]匹配,实际上并没有国际上的数字意识。(感谢OregonGhost指出这一点!)
甚至另一种替代方法是使用Java的内置java.text.NumberFormat对象查看在解析字符串之后解析器位置是否在字符串的末尾。如果是这样,我们可以假设整个字符串是数字:
public static boolean isNumeric(String str) { NumberFormat formatter = NumberFormat.getInstance(); ParsePosition pos = new ParsePosition(0); formatter.parse(str, pos); return str.length() == pos.getIndex(); }