Jon*_*nik 7 java wicket decimal-point bigdecimal
在Wicket应用程序中,我有一个十进制数字文本字段:
TextField<BigDecimal> f =
new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));
Run Code Online (Sandbox Code Playgroud)
我希望它始终接受两者.(点)和,(逗号)作为小数点分隔符(无论浏览器的语言环境设置如何).
为了显示该值,使用会话的语言环境[在我们的例子中强制为"fi"( - >逗号)],但在这里我对该字段接受的输入感兴趣.
我的问题是,我是否必须将字段更改为TextField<String>,并手动转换为域对象的类型(BigDecimal)?或者是否有某种使用方法TextField<BigDecimal>(允许例如使用Wicket的MinimumValidator或RangeValidator),并且仍然接受两个小数分隔符?
Jon*_*nik 14
感谢@ bert的评论以及Wicket in Action的书,我发现了一种有效的方法.在Application类中,为BigDecimals指定自定义转换器:
@Override
protected IConverterLocator newConverterLocator() {
ConverterLocator converterLocator = new ConverterLocator();
converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter());
return converterLocator;
}
Run Code Online (Sandbox Code Playgroud)
在自定义转换器中,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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑: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);
}
Run Code Online (Sandbox Code Playgroud)
在此自定义之后,像2.0005这样的十进制数将显示为2.0005而不是2.