【问题标题】:How to restrict more than two digits after a dot using Regex and DocumentFilter?如何使用 Regex 和 DocumentFilter 在点后限制超过两位数?
【发布时间】:2016-02-12 19:02:53
【问题描述】:

我正在尝试制作一些 JTextField 来仅验证货币 ($xxx.xx) 这样的双数字,我使用 DocumentFilter 编写了一个类来验证字符的模式和大小,但我无法实现的是用户可以输入多个点。

这是我的代码示例:

private class LimitCharactersFilter extends DocumentFilter {

    private int limit;
    private Pattern regex = Pattern.compile( "\\d*(\\.\\d{0,2})?");
    private Matcher matcher;

    public LimitCharactersFilter(int limit) {           
        this.limit = limit;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
            throws BadLocationException {
        String fullText = fb.getDocument().getText(0, fb.getDocument().getLength()) + string;
        matcher = regex.matcher(fullText);
        if((fullText.length()) <= limit && matcher.matches()){
            fb.insertString(offset, string, attr);
        }else{
            Toolkit.getDefaultToolkit().beep();
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
            throws BadLocationException {
        String fullText = fb.getDocument().getText(0, fb.getDocument().getLength()) + text;
        matcher = regex.matcher(fullText);
        matcher = regex.matcher(text);
        if((fullText.length()) <= limit && matcher.matches()){
            fb.replace(offset,length, text, attrs);
        }else{
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

这是界面外观的图片:

验证字符的限制效果很好,但如果已经有一个点,我想限制用户输入超过两位数。

希望有人可以帮助我。

【问题讨论】:

  • 试试\\d*\\.?\\d{0,2},但它只适用于实时输入。
  • @WiktorStribiżew 非常感谢!,这工作得很好,是的,我没有解释得太清楚,但我希望它用于实时输入,你的解决方案对我很有用.
  • 创建允许输入货币的文本字段的正确方法是使用new JFormattedTextField(NumberFormat.getCurrencyInstance())

标签: java regex swing documentfilter


【解决方案1】:

要在输入浮点数时允许输入点,您可以使用

\\d*\\.?\\d{0,2}

注意这里,

  • \\d* - 零个或多个数字
  • \\.? - 一个或零个点
  • \\d+ - 一位或多位数字

也请考虑使用 VGR 的建议:

new JFormattedTextField(NumberFormat.getCurrencyInstance());

这将创建一个允许输入货币的文本字段。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多