协慌网

登录 贡献 社区

如何检查 String 中的 String 是否为数字

在解析之前,如何检查字符串是否为数字?

答案

这通常使用简单的用户定义函数(即 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.isCreatableStringUtils.isNumeric

使用Apache Commons Lang 3.4 及以下版本: NumberUtils.isNumberStringUtils.isNumeric

您还可以使用StringUtils.isNumericSpace ,它为空字符串返回true并忽略字符串中的内部空格。另一种方法是使用StringUtils.isParsable ,它基本上根据 Java 检查数字是否可解析。 (链接的 javadoc 包含每种方法的详细示例。)

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

android.text.TextUtils.isDigitsOnly(CharSequence str)

文档可以在这里找到

保持简单 。大多数人都可以 “重新编程”(同样的事情)。