@bert のコメントとWicket in Action本のおかげで、うまくいくアプローチを見つけました。Application クラスで、BigDecimals のカスタム コンバーターを指定します。
@Override
protected IConverterLocator newConverterLocator() {
ConverterLocator converterLocator = new ConverterLocator();
converterLocator.set(BigDecimal.class, new CustomBigDecimalConverter());
return converterLocator;
}
また、カスタム コンバーターでは、convertToObject
オーバーライドする必要があります。NB : これで十分です。あなたの要件を考え、必要に応じて適応させてください!
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 のような 10 進数は 2 ではなく 2.0005 として表示されます。