我有以下代码来解析名为 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();
} 

其他提示

如果你看一下 应用程序编程接口, ,它明确表示:

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

如果你想查看解析器解析的程度,可以使用 其他位置感知方法. 。这样您就可以检查是否有任何尾随字符。您还可以使用例如通用语言检查整个字符串中的字母数字字符 是阿尔法.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top