自动校正双值输入

时间:2016-03-17 18:33:19

标签: filter javafx-8

我有一个字段和一个过滤器,只允许数字和,

如果我键入1,,我希望在离开文本字段时自动拥有1,0。 我可以解析它并用子字符串检查最后是否有,。但在我看来,这不是一个很好的方法。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

在您使用的文本格式化程序中使用转换器来过滤输入:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.function.UnaryOperator;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class DecimalTextField extends Application {

    @Override
    public void start(Stage primaryStage) {
        // decimal formatter for default locale:
        DecimalFormat decimalFormat = new DecimalFormat();
        decimalFormat.setMinimumFractionDigits(1);
        DecimalFormatSymbols symbols = decimalFormat.getDecimalFormatSymbols() ;
        char decimalSep = symbols.getDecimalSeparator() ;

        UnaryOperator<Change> filter = change -> {
            for (char c : change.getText().toCharArray()) {
                if ( (! Character.isDigit(c)) && c != decimalSep) {
                    return null ;
                }
            }
            return change ;
        };

        StringConverter<Double> converter = new StringConverter<Double>() {

            @Override
            public String toString(Double object) {
                return object == null ? "" : decimalFormat.format(object);
            }

            @Override
            public Double fromString(String string) {
                try {
                    return string.isEmpty() ? 0.0 : decimalFormat.parse(string).doubleValue();
                } catch (ParseException e) {
                    return 0.0 ;
                }
            }

        };

        TextFormatter<Double> formatter = new TextFormatter<>(converter, 0.0, filter);
        TextField textField = new TextField();
        textField.setTextFormatter(formatter);

        VBox root = new VBox(10, textField, new TextArea());
        root.setAlignment(Pos.CENTER);
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

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

(显然过滤器可以在这里改进,例如在输入中避免使用多个小数分隔符。)

答案 1 :(得分:0)

我认为最好的方法是将字符串转换为double,然后使用DecimalFormat将double转换回字符串。这样你就知道你的数字是你想要的格式。