Java DecimalFormat:如何拒绝带有分组小数的“无效”输入?

Posted

技术标签:

【中文标题】Java DecimalFormat:如何拒绝带有分组小数的“无效”输入?【英文标题】:Javas DecimalFormat: how to reject "invalid" input with grouped decimals? 【发布时间】:2009-11-05 12:02:43 【问题描述】:

使用以下 NumberFormat 时:

    NumberFormat amountFormat = NumberFormat
        .getNumberInstance(I18N.getThreadLocale());
    amountFormat.setMaximumFractionDigits(2);
    amountFormat.setMinimumFractionDigits(2);

通过解析得到如下结果

    System.out.println(amountFormat.parse(value));
10,50 => 1050 10,5 => 105 0,25 => 25

我知道在 Locale.ENGLISH 中,“,”是组分隔符。但我认为上述结果没有意义。我们的客户对这种格式感到奇怪。

如何禁用此分组?

我希望得到以下结果:

10,50 => ParseException 10,5 => ParseException 0,25 => ParseException

有没有标准的方法来做到这一点?还是我必须编写自己的 NumberFormat?

【问题讨论】:

为什么不在将逗号传递给解析值之前搜索它呢?如果您想获得格式异常,可以将逗号替换为另一个无效字符。 @kgiannakakis:我当然知道如何以编程方式完成。但我不明白为什么它是这样解决的?我只是想知道是否应该以及如何使用 JSE 库来完成。 相关:***.com/questions/2206371/… 【参考方案1】:

一个问题是分组字符(英语语言环境中的“,”)。要禁用对 NumberFormat 实例的分组支持,您可以简单地调用 setGroupingUsed(false)。

然而,这导致了一个不同的问题,即 NumberFormat 从字符串的开头解析,直到它到达一个未知字符。 parse("12foo") 将返回 12,就像 parse("10,50") 如果禁用分组将返回 10。要检查整个输入字符串是否被实际解析,您必须使用带有 ParsePosition 参数的 parse 方法并检查其索引以及输入字符串是否被解析到末尾或者解析器是否在字符串中的较早位置停止。

【讨论】:

以上是关于Java DecimalFormat:如何拒绝带有分组小数的“无效”输入?的主要内容,如果未能解决你的问题,请参考以下文章

Java DecimalFormat科学记数法问题

带点分隔符的 Java DecimalFormat 输出

Java 格式化数字--- DecimalFormat

在 DecimalFormat 处将点更改为逗号

JAVA:使用 DecimalFormat 时遇到问题?需要 30.40 而不是 30.4 [重复]

Java DecimalFormat 用法