JavaFX TextArea 接受负小数

JavaFX TextArea accept negative decimals

我正在创建一个自定义 TextArea,它在用户书写时接受负小数。

这是我在网上找到的十进制 TextAreas

public DecimalTextField() {

    super();

    UnaryOperator<Change> filter = new UnaryOperator<TextFormatter.Change>() {

        @Override
        public TextFormatter.Change apply(TextFormatter.Change t) {

            if (t.isReplaced()) 
                if(t.getText().matches("[^0-9]"))
                    t.setText(t.getControlText().substring(t.getRangeStart(), t.getRangeEnd()));


            if (t.isAdded()) {
                if (t.getControlText().contains(".")) {
                    if (t.getText().matches("[^0-9]")) {
                        t.setText("");
                    }
                } else if (t.getText().matches("[^0-9.]")) {
                    t.setText("");
                }
            }

            return t;
        }
    };

    this.setTextFormatter(new TextFormatter<>(filter));

}

现在我需要它在开头接受一个“-”,但我认为它并不像看起来那么简单。

使用此 ,创建自定义 StringConverter<Double> 并将其与 UnaryOperator<TextFormatter.Change> 一起使用以仅接受双数:

NumberFormat numberFormat = NumberFormat.getNumberInstance(); // you can set a locale here
UnaryOperator<TextFormatter.Change> filter = change -> {
    String controlNewText = change.getControlNewText();
    if ("-".equals(controlNewText)) {
        return change;
    } else {
        try {
            numberFormat.parse(controlNewText);
            return change;
        } catch (ParseException | NullPointerException ignored) {
            return null;
        }
    }
};
StringConverter<Double> converter = new StringConverter<Double>() {
    @Override
    public Double fromString(String s) {
        try {
            return numberFormat.parse(s).doubleValue();
        } catch (ParseException ignored) {
            return 0.0;
        }
    }
    @Override
    public String toString(Double d) {
        return numberFormat.format(d);
    }
};
this.setTextFormatter(new TextFormatter<>(converter, 0.0, filter));

UPDATE:答案是更新为使用 NumberFormat 而不是正则表达式 Pattern 以避免在使用不同的 Locale 时发生问题。