java - 我如何在 Java 中创建一个只能接受数字和一个点的字段?

标签 java regex swing jtextfield documentfilter

我在网上找遍了,但我尝试过的所有方法都没有用....

我发现我可以使用一些 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/

相关文章:

java - 强制子类仅绑定(bind)到该子类的枚举

java - 正确使用带有 Servlet 的有状态 Bean

Java反射调用不起作用

java - 如何在浏览器关闭时触发小程序中的 windowClosing() 事件

java - 在java游戏中打开问题

java - 使用其中包含多个证书的 Java keystore 关闭 SSL 连接

java - 如何使 JFrame 背景和 JPanel 透明,只显示图像

python - 从 HTML 中删除 Script 标签和 on 属性

javascript - 需要正则表达式来查找标签外的文本 仅 javascript

c - 与 glibc 中的正则表达式( anchor )不一致