JavaFX TextArea 接受负小数



我正在创建一个自定义文本区域,它在用户写作时接受负小数。

这是我在网上找到的十进制文本区域

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));

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

最新更新