javafx:使用TextField的+ FORMAT结果

时间:2016-05-27 11:35:52

标签: java javafx formatting currency

我有一个TextField,用户输入的工资。 TF具有基于默认区域设置的TextFormatter。在TextField旁边有一个Label,在这个标签中我想显示TextField文本格式化为货币,对于所有这些我使用此代码:

TextField text = new TextField();
Label show = new Label();

TextFormatter<Number> formatter = new TextFormatter<>(new FormatStringConverter<>(DecimalFormat.getNumberInstance()));

text.setTextFormatter(formatter);

show.textProperty().bind(Bindings.concat(text.getTextFormatter().valueProperty().asString())
.concat(" ").concat(Currency.getInstance(Locale.getDefault()).getCurrencyCode()));

return new HBox(text, show);

结果: enter image description here

如您所见,标签文本未格式化为数字 - 因为未应用格式化程序 - 。 所以我的问题是如何使标签的文本格式化,同时与TextField TextProperty绑定。

有人可能会问:为什么不使用货币格式化程序而不是数字格式化程序,如:

new TextFormatter<>(new FormatStringConverter<>(DecimalFormat.getCurrencyInstance()));

答案是,当用户想要输入值时,他将需要删除所有数字而不是美元符号,例如,如果用户输入没有美元符号的值,则不会接受新值

这就是为什么我想将Formatted值显示为Label中的货币,而不是使用Currency Formatter。感谢。

2 个答案:

答案 0 :(得分:0)

格式不完全相同,但可能就是您所需要的。

    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
    show.textProperty().bind(Bindings.createStringBinding(
        () -> formatter.getValue() == null 
              ? "" 
              : currencyFormat.format(formatter.getValue().doubleValue()),         
        formatter.valueProperty()));

答案 1 :(得分:0)

这是我使用的解决方案

text.focusedProperty().addListener((ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) -> {
        if(!newPropertyValue){
            show.setText(form.format(formatter.getValue().doubleValue()));
        }
    });