Java - NumberFormat 成功解析无效字符串
Posted
技术标签:
【中文标题】Java - NumberFormat 成功解析无效字符串【英文标题】:Java - NumberFormat parsing invalid String with success 【发布时间】:2016-06-13 12:20:37 【问题描述】:我正在尝试检查用户是否以有效格式输入了数字。但似乎,无效的字符串也被成功解析。一个例子:
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)不抛出异常?
【问题讨论】:
也请看这里:***.com/questions/30782905/… 【参考方案1】:取自 java API
public abstract Number parse(String source, ParsePosition 解析位置)
如果可能,返回一个 Long(例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 并且没有小数),否则为 Double。如果 IntegerOnly 已设置,将在小数点处停止(或等效项;例如, 对于有理数“1 2/3”,将在 1) 之后停止。不扔 一个例外;如果没有对象可以解析,则索引不变!
这是预期的行为,结果将是 128.598
【讨论】:
【参考方案2】:确实,parse
方法在这种情况下不会抛出任何异常,因此您应该提供一个 ParsePosition
并检查此 index
是否已设置为 String
的末尾,表明整个 @987654325 @ 已成功解析,而不是开头。
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
【讨论】:
好主意。谢谢 你也可以使用System.out.println(parsePosition.getErrorIndex() == -1)
@rasmusgude 在这两种情况下你都应该尝试调用parsePosition.getErrorIndex()
,即使使用value2
,你也会得到-1
,这不是预期的
@NicolasFilotto 感谢您的更新。你完全正确,别管我的评论。你知道为什么getErrorIndex()
无效吗?文档另有说明,值 12345TEST
似乎表现如预期 (getErrorIndex != -1)
@rasmusgude 因为解析器不认为它是解析错误,它只是忽略.77
并返回128.598
以上是关于Java - NumberFormat 成功解析无效字符串的主要内容,如果未能解决你的问题,请参考以下文章
Java 中非默认语言环境的 NumberFormat 解析不正确
使用 java.text.NumberFormat 解析日本货币字符串
如何使用 NumberFormat 类在 java 中解析“1,23$”并获得 123 作为数字
使用指定的语言环境 (sv) 和 NumberFormat 将字符串解析为 Long