Java中NumberFormat的奇怪行为

8

我有以下代码来解析名为str的字符串变量。

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);

我想捕获当str不是数字时抛出的异常,以验证它。我的问题是它并不总是抛出预期的ParseException。当字符串str以数字开头但随后是字符时,似乎会获取字符串的前几个字符并将其解析为数字。
例如:
- 如果str="a10",则会抛出ParseException - 如果str="10a",则不会抛出异常,数字为10
我不能使用Double.parseDouble(str),因为str可以有逗号和点,如1,000.98,而此方法无法理解这种格式。
为什么会发生这种情况?我还能用其他方法进行验证吗? 谢谢

1
我并不是认为NumberFormat的行为有问题,而是我误解了API。我以为position是用来指示我想解析字符串到哪个字符。现在我明白为什么它被设计成这样了。感谢你们所有人的回答。 - Javi
2个回答

8

这种行为并不奇怪,它是按设计来的。

从给定字符串的开头解析文本以生成一个数字。该方法可能不使用给定字符串的全部文本。

您可以像这样使用位置感知解析方法:

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();
} 

对我很有用:使用 setParseIntegerOnly(true),如果在期望整数时发现浮点数,则会抛出异常。 - xdola

6
如果你查看API,它明确表示:
解析给定字符串的开头以产生一个数字。该方法可能不会使用给定字符串的全部文本。
如果你想检查解析器解析的程度,可以使用其他位置感知的方法。这样您可以检查是否有任何尾随字符。您还可以使用例如通用语言库中的isAlpha检查整个字符串是否包含字母数字字符。

抱歉,sfussenegger,在我更新使用位置感知方法之前,我没有看到你的帖子。 - Alexander Torstling
@disown 很可能是因为你比我快;) - sfussenegger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接