问题
在解析字符串之前,如何检查 String
是否为数字?
#1 热门回答(779 赞)
这通常使用简单的用户定义函数(即Roll-your-own“isNumeric”函数)来完成。
就像是:
public static boolean isNumeric(String str)
{
try
{
double d = Double.parseDouble(str);
}
catch(NumberFormatException nfe)
{
return false;
}
return true;
}
但是,如果你正在大量调用这个函数,并且你期望许多检查由于不是一个数字而失败,那么这个机制的性能将不会很好,因为你依赖于每次失败抛出的异常,这是一个相当昂贵的操作。
另一种方法可能是使用正则表达式来检查作为数字的有效性:
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();
}
#2 热门回答(550 赞)
WithApache Commons Lang3.5及更高版本:NumberUtils.isCreatable
或StringUtils.isNumeric
。
WithApache Commons Lang3.4及以下:NumberUtils.isNumber
或StringUtils.isNumeric
。
你还可以使用StringUtils.isNumericSpace
,它为空字符串返回“true”并忽略字符串中的内部空格。 (链接的javadoc包含每个方法的详细示例。)
#3 热门回答(127 赞)
如果你在Android上,那么你应该使用:
android.text.TextUtils.isDigitsOnly(CharSequence str)
documentation can be found here
把事情简单化。大多数人都可以“重新编程”(同样的事情)。