我正在使用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());
一切工作正常,除非我无法退格整个文本字段。
任何帮助将是可观的。谢谢!
最佳答案
从documentation of TextFormatter.getFilter():
筛选器本身是一个接受UnaryOperator
对象的TextFormatter.Change
。它应该返回一个TextFormatter.Change
对象,其中包含实际的(过滤后的)更改。返回null会拒绝更改。
如果文本没有数字,则无法对其进行分析,在这种情况下,您将返回null,这将导致键入更改被拒绝。
一种选择是简化TextFormatter:
return new TextFormatter<Number>(
new NumberStringConverter(CURRENCY_DECIMAL_FORMAT));