这通常使用简单的用户定义函数(即 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.
}
但是,请注意上面的 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();
}
使用Apache Commons Lang 3.5 及更高版本: NumberUtils.isCreatable
或StringUtils.isNumeric
。
使用Apache Commons Lang 3.4 及以下版本: NumberUtils.isNumber
或StringUtils.isNumeric
。
您还可以使用StringUtils.isNumericSpace
,它为空字符串返回true
并忽略字符串中的内部空格。另一种方法是使用StringUtils.isParsable
,它基本上根据 Java 检查数字是否可解析。 (链接的 javadoc 包含每种方法的详细示例。)
如果你在 Android 上,那么你应该使用:
android.text.TextUtils.isDigitsOnly(CharSequence str)
保持简单 。大多数人都可以 “重新编程”(同样的事情)。