Java 需要帮助将文本框限制为仅十进制数字吗

Java 需要帮助将文本框限制为仅十进制数字吗,java,javafx,Java,Javafx,好的,我目前正在用JavaFX设计一个GUI。我有一个文本框,需要允许双重。它目前允许双精度,但允许用户添加多个小数 我想要的:92.8123 我不想要的:92..5.78 我试过摆弄它,但我对正则表达式的理解不够,无法将文本框适当地限制在我想要的范围内 tpo.textProperty().addListener((observable, oldValue, newValue) -> { if (!newValue.matches("\\d*")) tpo.setText

好的,我目前正在用JavaFX设计一个GUI。我有一个文本框,需要允许双重。它目前允许双精度,但允许用户添加多个小数

我想要的:92.8123

我不想要的:92..5.78

我试过摆弄它,但我对正则表达式的理解不够,无法将文本框适当地限制在我想要的范围内

tpo.textProperty().addListener((observable, oldValue, newValue) -> {
        if (!newValue.matches("\\d*")) tpo.setText(newValue.replaceAll("[^\\d.]", ""));
    });

tpo是文本框的名称

我想这可能会满足您的要求:

import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
...

TextField tpo = ...;
tpo.setTextFormatter(new TextFormatter<>((change) -> {
        String text = change.getControlNewText();
        if (text.matches("\\d*\\.?\\d*")) {
            return change;
        } else {
            return null;
        }
    }));
导入javafx.scene.control.TextField;
导入javafx.scene.control.TextFormatter;
...
TextField tpo=。。。;
tpo.setTextFormatter(新的TextFormatter((更改)->{
String text=change.getControlNewText();
if(text.matches(“\\d*\.?\\d*”){
回报变化;
}否则{
返回null;
}
}));

对于应用于
TextField
的每个更改,这将检查新文本是什么,并确保它与给定的模式匹配。由于用户可能一次输入一个字符(而不是粘贴),我们需要允许模式的后面部分可能尚未键入,因此我们需要允许点后零个或多个数字,如果我们希望用户能够完全删除他们的输入,我们需要一切都是可选的。您需要在提交时检查最终模式,以验证他们输入了完全有效的双精度。

我测试并修复了我的答案。如果它的行为符合您的要求,请告诉我。a)不要将侦听器中的文本更改为textProperty,而是使用@xtratic的答案中所述的TextFormatter b)甚至不要尝试篡改自定义模式匹配(在依赖于语言环境的上下文中会失败)-使用NumberFormatter et aldon不要进行自定义模式匹配(跨区域设置将不安全),请改为在TextFormatter中使用NumberFormatter等谢谢。它正是我所需要的。我很感激!@kleopatra好建议,请随意编辑并添加更好的区域设置无关解析。