你可以制作一个 TextField接受 , 和 。作为小数点分隔符?

发布于 2024-11-19 13:21:40 字数 579 浏览 2 评论 0原文

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

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

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

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

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

In a Wicket app, I have a decimal number text field:

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

I want it to always accept both . (dot) and , (comma) as decimal separator (regardless of browser's locale settings).

For showing the value, session's locale is used [which in our case is forced to be "fi" (-> comma)], but here I'm interested in what the field accepts as input.

My question is, do I have to change the field to TextField<String>, and convert to domain object's type (BigDecimal) manually? Or is there some way to use TextField<BigDecimal> (which allows e.g. making use of Wicket's MinimumValidator or RangeValidator), and still have it accept both decimal separators?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梨涡少年 2024-11-26 13:21:40

感谢 @bert 的评论和《Wicket in Action》一书,我找到了一种有效的方法。在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。

Thanks to @bert's comment, and the Wicket in Action book, I found an approach that works. In the Application class specify a custom converter for BigDecimals:

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

And in the custom converter, convertToObject needs to be overridden. NB: this is sufficient for our needs; think about your requirements and adapt as needed!

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: Offtopic, but I want to document this too. We needed our app to support a scale of 4 decimal places, and our custom BigDecimal converter nicely solves that problem too.

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

After this customisation, a decimal number like 2.0005 will be shown as 2.0005 instead of 2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文