Java 你能做一个文本字段吗<;BigDecimal>;两者都接受,并且。作为十进制分隔符?

Java 你能做一个文本字段吗<;BigDecimal>;两者都接受,并且。作为十进制分隔符?,java,wicket,bigdecimal,decimal-point,Java,Wicket,Bigdecimal,Decimal Point,在Wicket应用程序中,我有一个十进制数字文本字段: TextField<BigDecimal> f = new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share")); TextField f= 新文本字段(“f”,新属性模型(模型,“共享”); 我希望它总是能同时接受这两种情况。(点)和(逗号)作为十进制分隔符(与浏览器的区域设置无关) 为了显示

在Wicket应用程序中,我有一个十进制数字文本字段:

 TextField<BigDecimal> f = 
     new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));
TextField f=
新文本字段(“f”,新属性模型(模型,“共享”);
我希望它总是能同时接受这两种情况。(点)和(逗号)作为十进制分隔符(与浏览器的区域设置无关)

为了显示值,使用了会话的区域设置[在我们的例子中,该区域设置被强制为“fi”(>逗号)],但这里我感兴趣的是字段接受什么作为输入


我的问题是,我是否必须将字段更改为
TextField
,并手动转换为域对象的类型(BigDecimal)?或者是否有某种方法可以使用
文本字段
(例如,允许使用Wicket的MinimumValidator或RangeValidator),并且仍然让它同时接受十进制分隔符?

多亏了@bert的评论和Wicket in Action book,我找到了一种有效的方法。在应用程序类中,为大小数指定自定义转换器:

@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator converterLocator = new ConverterLocator();
    converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter());
    return converterLocator;
}
在自定义转换器中,
convertToObject
需要被覆盖NB:这足以满足我们的需求;考虑您的需求并根据需要进行调整

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);
    }
}
编辑:Offtopic,但我也想将其记录下来。我们需要我们的应用程序支持小数点后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。

我现在没有文档,但您可以在应用程序类中全局注册转换器。因此,您可以为BigDecimal注册自己的转换器实现,并在中接受这两个变量there@bert谢谢阅读《Wicket in Action》(第163页),这可能确实是实现这一点的最佳方式。。。也可以把它写为一个答案。只需警告一下:在某些区域,两个字符都可以出现在同一个数字中,即<代码>。用于将成千上万和<代码>、< /代码>作为小数分隔符。如果您想要一个通用数字解析器,请确保您的代码能够处理像
32.519.100,28
@biziclop:是的,很好。(在我们的例子中,我们不需要一个通用的解决方案,所以我们可以用一些简单的方法,比如我发布的答案。)