我在为一个TextField的限制而烦恼,它只能输入被点分割的数字。这是我得到的结果。
public static void allowOnlyNumbersAndPoints(final TextField tf) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
if (!newValue.matches("\\d+(\\.\\d+)*$")) {
tf.setText(newValue.replaceAll("[^\\d]", ""));
}
}
});
}
我如何把点也替换成""?
THANKS:)
你可以使用 \\d+\\.?\\d*
.
演示:
public class Main {
public static void main(String[] args) {
String[] testStrs = { "100", "123.23", "a1", "1a", "a1.2", "0.23" };
for (String s : testStrs) {
System.out.println(s + (s.matches("\\d+\\.?\\d*") ? " matches " : " doesn't match"));
}
}
}
输出。
100 matches
123.23 matches
a1 doesn't match
1a doesn't match
a1.2 doesn't match
0.23 matches
你必须使用regex "[^0-9]"
在你的号召下 replaceAll
来替换任何不是数字的东西。"[^\\d]"
(你目前有的)不应该工作,因为命名组不能在方括号内工作。
这可能会奏效 \d+[\d.]*[\d$]*
你说的点数是指很多点数还是只有一个点数?
试试这样。
String r = "(?:\\d+)?[\\.]?\\d+|\\d+\\.";
for (String num : new String[] { "2.33", "33.3", "33", ".33",
"44.", "4.4.4", "a.3", "44.k" }) {
System.out.printf("%5s : %s%n", num,
" " + (num.matches(r) ? "valid" : "not valid"));
}
打印
2.33 : valid
33.3 : valid
33 : valid
.33 : valid
44. : valid
4.4.4 : not valid
a.3 : not valid
44.k : not valid