如何检查一个 String 是否为数字

问题

在解析字符串之前,如何检查 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.isCreatableStringUtils.isNumeric

WithApache Commons Lang3.4及以下:NumberUtils.isNumberStringUtils.isNumeric

你还可以使用StringUtils.isNumericSpace,它为空字符串返回“true”并忽略字符串中的内部空格。 (链接的javadoc包含每个方法的详细示例。)


#3 热门回答(127 赞)

如果你在Android上,那么你应该使用:

android.text.TextUtils.isDigitsOnly(CharSequence str)

documentation can be found here
把事情简单化。大多数人都可以“重新编程”(同样的事情)。