如何在 Java 中检查字符串是否为数字

2022-08-31 03:59:37

在解析字符串之前,您如何检查它是否是一个数字?


答案 1

这通常使用简单的用户定义函数(即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();
}

答案 2

使用Apache Commons Lang 3.5及更高版本:NumberUtils.isCreatableStringUtils.isNumeric

使用Apache Commons Lang 3.4及更低版本:NumberUtils.isNumberStringUtils.isNumeric

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