Как ограничить более двух цифр после точки с помощью Regex и DocumentFilter?

Я пытаюсь сделать некоторые JTextFields для проверки только двойных чисел, таких как валюта ($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();
        }
    }
}

А вот изображение того, как выглядит интерфейс: Снимок экрана интерфейса

Проверка предела символов отлично работает, но я хочу запретить пользователю вводить более двух цифр, если точка уже есть.

Надеюсь, кто-то может помочь мне с этим.


person Andres Valencia    schedule 12.02.2016    source источник
comment
Попробуйте \\d*\\.?\\d{0,2}, но это будет хорошо только для живого ввода.   -  person Wiktor Stribiżew    schedule 12.02.2016
comment
@WiktorStribiżew Большое спасибо! Это сработало очень хорошо, и да, я не слишком хорошо это объяснил, но я хотел, чтобы это было для живого ввода, и ваше решение отлично сработало для меня.   -  person Andres Valencia    schedule 12.02.2016
comment
Правильный способ создания текстового поля, допускающего ввод валюты, — это new JFormattedTextField(NumberFormat.getCurrencyInstance()).   -  person VGR    schedule 12.02.2016


Ответы (1)


Чтобы разрешить ввод точки при вводе числа с плавающей запятой, вы можете использовать

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

Обратите внимание, что здесь

  • \\d* - ноль или более цифр
  • \\.? - одна или ноль точек
  • \\d+ - одна или несколько цифр

Также рассмотрите возможность использования предложения VGR:

new JFormattedTextField(NumberFormat.getCurrencyInstance());

Это создаст текстовое поле, которое позволяет вводить валюту.

person Wiktor Stribiżew    schedule 12.02.2016