如何在 Java 中检查字符串是否为数字
在解析字符串之前,您如何检查它是否是一个数字?
这通常使用简单的用户定义函数(即Roll-your-own“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.
}
但是,请小心使用上述正则表达式机制,因为如果您使用非阿拉伯数字(即0到9以外的数字),它将失败。这是因为正则表达式的“\d”部分仅匹配 [0-9],并且实际上不具有国际数字意识。(感谢OregonGhost指出这一点!
或者甚至另一种选择是使用Java内置的java.text.NumberFormat对象来查看在解析字符串后解析器位置是否位于字符串的末尾。如果是,我们可以假设整个字符串都是数字:
public static boolean isNumeric(String str) {
ParsePosition pos = new ParsePosition(0);
NumberFormat.getInstance().parse(str, pos);
return str.length() == pos.getIndex();
}
使用Apache Commons Lang 3.5及更高版本:NumberUtils.isCreatable
或StringUtils.isNumeric
。
使用Apache Commons Lang 3.4及更低版本:NumberUtils.isNumber
或StringUtils.isNumeric
。
您还可以使用 StringUtils.isNumericSpace
,它返回空字符串并忽略字符串中的内部空格。另一种方法是使用NumberUtils.isParsable
,它基本上检查数字是否可根据Java解析。(链接的javadocs包含每种方法的详细示例。true