【问题标题】:Java - NumberFormat parsing invalid String with successJava - NumberFormat 成功解析无效字符串
【发布时间】: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)不抛出异常?

【问题讨论】:

标签: java


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2012-10-25
    • 2021-06-03
    相关资源
    最近更新 更多