我正在尝试检查用户是否输入了有效格式的号码。但似乎无效的String也被成功解析。一个例子:
final String value1 = "12,85", value2 = "128,598.77";
NumberFormat format = NumberFormat.getInstance(Locale.GERMAN);
format.parse(value1); // ok
format.parse(value2); // ok, but it's not german format
为什么format.parse(value2)不会抛出异常?
答案 0 :(得分:4)
取自java API
public abstract Number parse(String source,ParsePosition 一个ParsePosition)
如果可能,返回Long(例如,在[Long.MIN_VALUE, Long.MAX_VALUE]并且没有小数),否则为Double。如果 设置IntegerOnly,将停在小数点(或等效点;例如, 对于有理数的数字" 1 2/3",将在1)之后停止。不扔 例外;如果没有对象可以解析,索引就不变了!
这是预期的行为,结果将是128.598
答案 1 :(得分:1)
确实,方法parse
在这种情况下不会抛出任何异常,因此您应该提供ParsePosition
并检查此index
是否已设置为String
的末尾{1}}表示已成功解析整个String
,而不仅仅是开头。
ParsePosition parsePosition = new ParsePosition(0);
format.parse(value1, parsePosition); // ok
System.out.println(parsePosition.getIndex() == value1.length());
parsePosition = new ParsePosition(0);
format.parse(value2, parsePosition); // ok, but it's not german format
System.out.println(parsePosition.getIndex() == value2.length());
<强>输出:强>
true
false