在javafx中显示TextField中的浮点数

时间:2017-01-13 13:58:05

标签: java javafx double textfield floating

我正在尝试在我的测试应用中创建付款部分。

我有TextField,它接受Buttons值(从0到9)并在最后添加它。

TextField pamount;

String value = ((Button)event.getSource()).getText();

    pamount.setText(pamount.getText()+value);

所以,如果我连续点击1到9的按钮,我就会

123456789
TextField中的

我的问题是我希望它显示为像

这样的浮动数字
1234567.89

有没有办法将TextField格式化为保持或显示这样的值?

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果您希望按下按钮以更改某个数字的值,则应定义一个变量来保存该数字。为避免重复执行浮点运算(在某些时候可能累积舍入误差),最好让该变量保持分数(或等值货币),即整数。

此外,为了方便文本字段(或标签)始终显示与该值对应的文本值,使用JavaFX observable property很方便。

所以我会这样做:

private IntegerProperty totalCents = new SimpleIntegerProperty();

然后您可以让您的显示将其文本绑定到该属性的格式化版本:

display.textProperty().bind(totalCents.divide(100.0).asString("$ %.2f"));

最后,您的按钮只需更新数值:

private Button createNumberButton(int value) {
    Button button = new Button(Integer.toString(value));

    button.setOnAction(e -> totalCents.set(totalCents.get() * 10 + value));

    return button ;
}

这是一个SSCCE:

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class PaymentPad extends Application {

    private IntegerProperty totalCents = new SimpleIntegerProperty();

    @Override
    public void start(Stage primaryStage) {
        GridPane pad = new GridPane();
        pad.setHgap(2);
        pad.setVgap(2);

        pad.add(createNumberButton(0), 0, 4);
        for (int i = 1 ; i <= 9 ; i++) {
            int columnIndex = (i-1) % 3;
            int rowIndex = 3 - (i-1) /3 ;
            pad.add(createNumberButton(i), columnIndex, rowIndex);
        }

        Button clearButton = createButton("C");
        clearButton.setOnAction(e -> totalCents.set(0));
        pad.add(clearButton, 1, 4, 2, 1);

        Label display = new Label();
        display.textProperty().bind(totalCents.divide(100.0).asString("$%.2f"));
        display.setMaxWidth(Double.MAX_VALUE);
        display.setAlignment(Pos.CENTER_RIGHT);
        pad.add(display, 0, 0, 3, 1);

        Scene scene = new Scene(pad);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Button createNumberButton(int value) {
        Button button = createButton(Integer.toString(value));
        button.setOnAction(e -> totalCents.set(totalCents.get()*10+value));
        return button ;
    }

    private Button createButton(String text) {
        Button button = new Button(text);
        button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        GridPane.setFillHeight(button, true);
        GridPane.setFillWidth(button, true);
        return button ;     
    }

    public static void main(String[] args) {
        launch(args);
    }
}

答案 1 :(得分:1)

使用DecimalFormat:

DecimalFormat format = new DecimalFormat("#.00"); 
String formattedText = format.format(value);