NumberFormat Java的奇怪行为

Jav*_*avi 6 java validation parsing number-formatting

我有以下代码来解析一个名为str的String变量.

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
Run Code Online (Sandbox Code Playgroud)

我想捕获当str不是一个数字时抛出的异常只是为了验证它.我遇到的问题是它并不总是抛出预期的ParseException.当String str以数字开头但后来是字符时,它似乎得到字符串的第一个字符并将它们解析为数字.

例如:

  • 如果str ="a10"则抛出ParseException
  • 如果str ="10a"则没有抛出异常且number = 10

我不能使用Double.parseDouble(str),因为str可以有逗号和点,如1,000.98,这种方法不能理解这种格式.

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

Ale*_*ing 6

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

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

如果要查看解析器解析的距离,可以使用其他位置感知方法.这样你就可以检查你是否有任何尾随的字符.你也可以使用常见的langs isAlpha检查整个字符串中的字母数字字符.


sfu*_*ger 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();
} 
Run Code Online (Sandbox Code Playgroud)