我在网上找遍了,但我尝试过的所有方法都没有用....
我发现我可以使用一些 JTextFormatterField,但它不起作用。
然后我发现我可以将 DocumentFilter 与正则表达式一起使用,我所做的是:
JTextField jFormattedTextFieldMoneyToConvert = new JTextField();
((AbstractDocument) jFormattedTextFieldMoneyToConvert.getDocument()).setDocumentFilter(new DocumentFilter(){
Pattern regEx = Pattern.compile("^\\d+\\.?\\d*$");
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
Matcher matcher = regEx.matcher(text);
if (!matcher.matches()) {
return;
}
super.replace(fb, offset, length, text, attrs);
}
});
但它不起作用...它只接受数字。我希望它也接受点。而且我还需要它不要以点开头,也不要以点结尾。
我做错了什么?
最佳答案
这可能是最简单的代码:
if (text.matches("\\d+(\\.\\d+)?"))
如果有一个点,它后面必须跟一些数字。如果你想允许一个点然后也没有数字,将 +
更改为 *
:
if (text.matches("\\d+(\\.\\d*)?"))
请注意,对于 String#matches()
,前导/尾随 ^
/$
不是必需的,因为它们是隐含的,因为必须匹配整个 字符串,matches()
才能返回true
。
不允许前导数字也变得更棘手,因为正则表达式 (\d+)?(\.\d*)
匹配空白字符串,因此您需要一个替代:
if (text.matches("\\d+(\\.\\d*)?|\\.\\d+"))
或消极的展望:
if (text.matches("(?!$)\\d*(\\.\\d*)?"))
小look头断言start后的下一个位置不是end(即input不为空)
关于java - 我如何在 Java 中创建一个只能接受数字和一个点的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167524/