NumberFormat Java 的奇怪行为
-
20-09-2019 - |
题
我有以下代码来解析名为 str 的字符串变量。
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
我想捕获当 str 不是数字时抛出的异常只是为了验证它。我遇到的问题是它并不总是抛出预期的 ParseException 。当字符串 str 以数字开头但随后是字符时,它似乎会获取字符串的第一个字符并将它们解析为数字。
例如:
- 如果 str="a10" 则抛出 ParseException
- 如果 str="10a" 则不会抛出异常且 number=10
我无法使用 Double.parseDouble(str) 因为 str 可以包含逗号和点(例如 1,000.98),并且此方法无法理解此格式。
为什么会发生这种情况?我可以通过其他方式验证它吗?谢谢
解决方案
这种行为并不奇怪,这是设计好的
从给定字符串的开头解析文本以生成数字。该方法可能不会使用给定字符串的整个文本。
您可以使用像这样的位置感知解析方法:
public static double parse(String str) throws ParseException {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition position = new ParsePosition(0);
Number number = formatter.parse(str, position);
if (position.getIndex() != str.length()) {
throw new ParseException("failed to parse entire string: " + str, position.getIndex());
}
return number.doubleValue();
}
不隶属于 StackOverflow