我正在使用javafx.scene.control.TextFormatter将文本字段格式化为货币字段。下面显示了我的代码。

private static final double DEFAULT_VALUE = 0.00d;
private static final String CURRENCY_SYMBOL = "Rs"; //
public static final DecimalFormat CURRENCY_DECIMAL_FORMAT
        = new DecimalFormat(CURRENCY_SYMBOL + "###,##0.00");

public static TextFormatter<Double> currencyFormatter() {
    return new TextFormatter<Double>(new StringConverter<Double>() {
        @Override
        public String toString(Double value) {
            return CURRENCY_DECIMAL_FORMAT.format(value);
        }

        @Override
        public Double fromString(String string) {
            try {
                return CURRENCY_DECIMAL_FORMAT.parse(string).doubleValue();
            } catch (ParseException e) {
                return Double.NaN;
            }
        }
    }, DEFAULT_VALUE,
            change -> {
                try {
                    CURRENCY_DECIMAL_FORMAT.parse(change.getControlNewText());
                    return change;
                } catch (ParseException e) {
                    return null;
                }
            }
    );
}

//format textfield into a currency formatted field
text_field.setTextFormatter(SomeClass.currencyFormatter());


一切工作正常,除非我无法退格整个文本字段。

java - Javafx TextFormatter后退问题-LMLPHP

任何帮助将是可观的。谢谢!

最佳答案

documentation of TextFormatter.getFilter()


  筛选器本身是一个接受UnaryOperator对象的TextFormatter.Change。它应该返回一个TextFormatter.Change对象,其中包含实际的(过滤后的)更改。返回null会拒绝更改。


如果文本没有数字,则无法对其进行分析,在这种情况下,您将返回null,这将导致键入更改被拒绝。

一种选择是简化TextFormatter:

return new TextFormatter<Number>(
    new NumberStringConverter(CURRENCY_DECIMAL_FORMAT));

09-19 06:29