当前位置: 首页 > 面试题库 >

你能做一个TextField吗同时接受和。作为小数点分隔符?

贝杜吟
2023-03-14
问题内容

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

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

我希望它总是接受两者。(点)和,(逗号)作为小数点分隔符( 无论 浏览器的语言环境设置如何)。

为了 显示 该值,使用了会话的语言环境[在我们的例子中,该语言环境被强制为“ fi”(->逗号)],但是在这里,我对字段 接受 输入内容感兴趣。

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


问题答案:

感谢@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);
    }
}

编辑
: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。



 类似资料:
  • 问题内容: 我目前使用以下代码打印双精度代码: 除Java在我想使用点时使用Java语言环境的小数点分隔符(逗号)外,此方法运行良好。是否有捷径可寻? 问题答案: 使用其中的重载可以指定语言环境: 如果您 仅 格式化数字(如此处所示),则使用可能更合适。但是,如果您需要其余的格式化功能,则应该可以正常工作。

  • 我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。 有人能帮我修一下吗?

  • 假设我在一个已经有后台线程的服务中。我可以在同一个线程中使用volley来执行请求吗,这样回调就会同步发生? 这有两个原因:-首先,我不需要另一个线程,创建它将是一种浪费。-其次,如果我在ServiceIntent中,线程的执行将在回调之前完成,因此我将没有来自Volley的响应。我知道我可以创建我自己的服务,它有一些线程,我可以控制运行循环,但它希望有这个功能在Volley。

  • 如果给出了类似的输入,那么输出应该是。同样,然后。 但我有个错误。我应该怎么做才能达到那个输出呢?

  • 问题内容: 给定一个语言环境java.text.NumberFormat: 如何获得该数字格式中用作十进制分隔符的字符(如果是逗号或点)?如何在不必使用新的DecimalFormat(format)的情况下修改此属性? 谢谢 问题答案: 您正在寻找帮助器类DecimalFomatSymbols: 要根据需要设置符号: 编辑: 此答案仅对有效,而对问题所要求的无效。无论如何,因为这可能会对作者有所帮

  • 我有一个由Java8流表示的数据集: 谢谢你的洞察力。