在解析字符串之前如何检查字符串是否为数字?
原文由 Craig Angus 发布,翻译遵循 CC BY-SA 4.0 许可协议
这通常是通过一个简单的用户定义函数(即 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) {
ParsePosition pos = new ParsePosition(0);
NumberFormat.getInstance().parse(str, pos);
return str.length() == pos.getIndex();
}
原文由 CraigTP 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
3 回答2k 阅读
2 回答781 阅读✓ 已解决
2 回答1.7k 阅读
使用 Apache Commons Lang 3.5 及更高版本:
NumberUtils.isCreatable
或StringUtils.isNumeric
。使用 Apache Commons Lang 3.4 及以下版本:
NumberUtils.isNumber
或StringUtils.isNumeric
。您还可以使用
StringUtils.isNumericSpace
返回true
空字符串并忽略字符串中的内部空格。另一种方法是使用NumberUtils.isParsable
基本上检查数字是否可以根据 Java 解析。 (链接的 javadocs 包含每种方法的详细示例。)