8

Wicket アプリには、10 進数のテキスト フィールドがあります。

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

常に両方を受け入れてほしい。(ドット) と , (コンマ) を小数点記号として使用します (ブラウザーのロケール設定に関係なく)。

値を表示するために、セッションのロケールが使用されます [この場合、強制的に "fi" (-> コンマ) になります] が、ここで、フィールドが入力として受け入れるものに興味があります。

私の質問は、フィールドを に変更し、TextField<String>手動でドメイン オブジェクトのタイプ (BigDecimal) に変換する必要がありますか? または、いくつかの使用方法TextField<BigDecimal>(たとえば、Wicket の MinimumValidator または RangeValidator を使用できるようにする) があり、それでも両方の小数点記号を受け入れることができますか?

4

1 に答える 1

15

@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 として表示されます。

于 2011-07-11T11:29:36.657 に答える