我有以下代码来解析名为str。
的String变量NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
我想捕获当str不是一个只是为了验证它的数字时抛出的异常。我遇到的问题是它并不总是抛出预期的ParseException。当String str以数字开头但后来是字符时,它似乎得到字符串的第一个字符并将它们解析为数字。
例如:
我不能使用Double.parseDouble(str),因为str可以有逗号和点,例如1,000.98,这种方法不能理解这种格式。
为什么会这样?我可以用其他方式验证吗? 感谢
答案 0 :(得分:6)
如果你看一下API,它会清楚地说:
从一开始就解析文本 给出字符串以产生数字。该 方法可能不会使用整个文本 给定的字符串。
如果要查看解析器解析的距离,可以使用other position-aware method。这样你就可以检查你是否有任何尾随的字符。您还可以使用常见的langs isAlpha检查整个字符串中的字母数字字符。
答案 1 :(得分: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();
}