你可以让TextField 同时接受,和。 作为小数分隔符?

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

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

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

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

我的问题是,我是否必须将字段更改为TextField ,并手动转换为域对象的类型(BigDecimal)? 或者有没有办法使用TextField (允许使用例如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。