3

NumberFormatterとを使用していますがJFormattedTextField.getValue()はユーザーが見ているのと同じ値を返しません。

入力文字列は NumberFormats parse-method を使用して解析されていると思いますNumberFormat.getNumberInstance();。実際の Locale から Numberformat を取得します。だから私は簡単にそれを拡張して独自の解析メソッドを書くことができるとは思わない?

では、ユーザーが を入力1234.487 すると: がgetValue()返されます 1234.487が、ユーザーは表示されます。1,234.49

を使用した別の例NumberFormat.getCurrencyInstance();。ユーザーが入力1234.487するgetValue()と返さ1234.487れますが、ユーザーが表示されます$1,234.49

代わりに、フォーマッターが丸めずに値をフォーマットできない場合に ParseException を生成する必要があります。ユーザー4.35b6が. 4.35_ 4.35_ _

これが私が試したコードです:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
final JFormattedTextField ftf = new JFormattedTextField(nf);
ftf.setValue(new BigDecimal("1234.50"));

// Print the value from ftf
final JTextField txt = new JTextField(12);
txt.addFocusListener(new FocusAdapter() {
    public void focusGained(FocusEvent e) {
        txt.setText(ftf.getValue().toString());
    }
});

ユーザーが見ているのと同じ値を取得する方法は?

4

2 に答える 2

6

文字列が解析されたときに元の値が返されることを確認できるように、オーバーライドするのNumberFormatterではなく拡張する必要があります。NumberFormatstringToValue

class StrictNumberFormatter extends javax.swing.text.NumberFormatter {
    @Override
    public Object stringToValue(String text) throws ParseException {
        Object parsedValue = super.stringToValue(text);
        String expectedText = super.valueToString(parsedValue);
        if (! super.stringToValue(expectedText).equals(parsedValue)) {
            throw new ParseException("Rounding occurred", 0);
        }
        return parsedValue;
    }

    public StrictNumberFormatter(NumberFormat nf) {
        super(nf);
    }
}

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
JFormattedTextField.AbstractFormatter formatter = new StrictNumberFormatter(nf);
final JFormattedTextField ftf = new JFormattedTextField(formatter);
ftf.setValue(new BigDecimal("1234.50"));

このフォーマッタは、丸めの前後の値が一致しない場合、新しいテキストを拒否します。

注: これは、文字列ではなくを比較します。"$1,000"グループ化文字 ( => "$1000") や末尾のゼロ ( "$1.20"=> )の削除などの変更を許容します"$1.2"。基本的に、NumberFormatが同じ値を返す場合は許容されます。ただしNumberFormat、通貨記号を削除したり、先頭にスペースを挿入したりしてはいけません。

于 2010-02-05T12:37:21.327 に答える
3

これを試して:

txt.setText(ftf.getFormatter().valueToString(ftf.getValue()));

メソッドがスローjava.text.ParseExceptionするも処理する必要があります。valueToString

編集: 無効なエントリを完全に禁止するようにフォーマッタを設定できます。

    ((DefaultFormatter)ftf.getFormatter()).setAllowsInvalid( false );
于 2010-02-05T10:25:42.727 に答える