感谢@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。