6

我有以下代码来解析一个名为 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 并且此方法不理解这种格式。

为什么会这样?我可以用任何其他方式验证它吗?谢谢

4

2 回答 2

6

如果您查看API,它会清楚地说明:

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

如果要查看解析器解析了多远,可以使用其他位置感知方法。这样您就可以检查是否有任何尾随字符。您还可以使用例如 common langs isAlpha检查整个字符串中的字母数字字符。

于 2010-02-15T13:03:57.923 回答
6

行为并不奇怪,这是设计的

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

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

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();
} 
于 2010-02-15T13:05:17.913 回答