NumberFormat Java的奇怪行为
我有以下代码来解析名为str的字符串变量NumberFormat Java的奇怪行为,java,validation,parsing,number-formatting,Java,Validation,Parsing,Number Formatting,我有以下代码来解析名为str的字符串变量 NumberFormat formatter = NumberFormat.getInstance(); Number number = formatter.parse(str); 我想捕捉当str不是数字时抛出的异常,只是为了验证它。我的问题是它并不总是抛出预期的ParseException。当字符串str以数字开头,然后是字符时,它似乎会从字符串的第一个字符中获取一个字符串,并将其解析为一个数字 例如: 如果str=“a10”,则会引发Parse
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
我想捕捉当str不是数字时抛出的异常,只是为了验证它。我的问题是它并不总是抛出预期的ParseException。当字符串str以数字开头,然后是字符时,它似乎会从字符串的第一个字符中获取一个字符串,并将其解析为一个数字
例如:
- 如果str=“a10”,则会引发ParseException
- 如果str=“10a”,则不会引发异常,并且number=10
如果您想查看解析器解析的距离,可以使用。这样你可以检查你是否有任何拖尾字符。您还可以使用例如通用langs来检查整个字符串中的字母数字字符。这种行为并不奇怪,它是按设计的 从给定字符串的开头解析文本以生成数字。该方法不能使用给定字符串的整个文本 您可以像这样使用位置感知解析方法:
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();
}
抱歉,Sfussenger,在我使用位置感知方法更新之前,没有看到你的帖子。@很可能是因为你比我快,所以拒绝;)我不是说NumberFormat的行为是错误的,但我误解了API。我认为位置是指示我要解析字符串的字符。现在我明白了为什么它是这样设计的。谢谢您的回答。对我很有用:如果您在需要整数时发现浮点,请使用
setParseIntegerOnly(true)
引发异常