你能让一个类型为BigDecimal的文本框(TextField<BigDecimal>)同时接受逗号和点作为小数分隔符吗?

8
在一个Wicket应用中,我有一个小数数字文本框:
 TextField<BigDecimal> f = 
     new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));

我希望它始终接受 .(点)和,(逗号)作为十进制分隔符(不考虑浏览器的语言环境设置)。

用于 显示 值的是会话的语言环境[在我们的情况下被强制为“fi”(->逗号)],但我在这里关心的是该字段 接受 的输入。

我的问题是,我是否必须将该字段更改为 TextField<String> 并手动转换为域对象的类型(BigDecimal)?还是有一些方法可以使用 TextField<BigDecimal>(例如利用Wicket的MinimumValidator或RangeValidator),并仍然接受两种十进制分隔符?


5
目前我没有文档,但是你可以在应用程序类中全局注册转换器。因此,你可以为BigDecimal注册自己的转换器实现,并在其中接受两个变量。 - bert
@bert,谢谢!阅读《Wicket in Action》(第163页),这可能确实是最好的方法来解决这个问题...也考虑将其写成答案。 - Jonik
2
只是提醒一下:在某些语言环境中,同一个数字中可能同时出现 . 用于千位分隔符,而,则作为小数点。如果你想要一个通用的数字解析器,请确保你的代码能够处理像 32.519.100,28 这样的数字。 - biziclop
@biziclop:是的,说得好。(在我们的情况下,我们不需要通用的解决方案,因此我们可以使用像我发布的答案那样更简单的东西。) - Jonik
1个回答

15
感谢@bert的评论和Wicket 实战一书,我找到了一个可行的方法。在Application类中指定一个用于BigDecimals的自定义转换器:
@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator converterLocator = new ConverterLocator();
    converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter());
    return converterLocator;
}

在自定义转换器中,需要重写 convertToObject 方法。需要注意的是:这对于我们的需求已经足够了,但您应该根据您的要求进行适当的调整!

public class CustomBigDecimalConverter extends BigDecimalConverter {

    @Override
    public BigDecimal convertToObject(String value, Locale locale) {
        // NB: this isn't universal & your mileage problably varies!
        // (Specifically, this breaks if '.' is used as thousands separator)
        if ("fi".equals(locale.getLanguage())) {
            value = value.replace('.', ',');
        }
        return super.convertToObject(value, locale);
    }
}

编辑:离题了,但我也想记录一下。我们需要应用程序支持4个小数位的比例,并且我们的自定义BigDecimal转换器也很好地解决了这个问题。

  @Override
    public String convertToString(Object value, Locale locale) {
        NumberFormat fmt = getNumberFormat(locale);
        fmt.setMaximumFractionDigits(4); // By default this is 3.
        return fmt.format(value);
    }

在进行此自定义之后,像2.0005这样的十进制数将显示为2.0005而不是2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接