您可以使 TextField 接受 , 和 。作为小数点分隔符?

2023-11-26

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

 TextField<BigDecimal> f = 
     new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));

我希望它始终接受两者。 (点) 和 , (逗号) 作为小数点分隔符 (不管浏览器的区域设置)。

For showing使用会话的区域设置值[在我们的例子中强制为“fi”(->逗号)],但在这里我感兴趣的是该字段accepts作为输入。

我的问题是,我是否必须将该字段更改为TextField<String>,并手动转换为域对象的类型(BigDecimal)?或者有什么方法可以使用TextField<BigDecimal>(例如,它允许使用 Wicket 的 MaximumValidator 或 RangeValidator),并且仍然接受两个小数点分隔符?


感谢@bert 的评论,以及检票口在行动书上,我找到了一种行之有效的方法。在 Application 类中指定 BigDecimals 的自定义转换器:

@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator converterLocator = new ConverterLocator();
    converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter());
    return converterLocator;
}

在自定义转换器中,convertToObject需要被覆盖。NB: 这足以满足our需要;考虑您的要求并根据需要进行调整!

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);
    }
}

Edit: 题外话,但我也想记录一下。我们需要我们的应用程序支持 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您可以使 TextField 接受 , 和 。作为小数点分隔符? 的相关文章

随机推荐