Каково регулярное выражение для проверки 'цены' в поле jtext - PullRequest
1 голос
/ 29 апреля 2010

Я хочу проверить поле jtext, когда пользователь вводит цену некоторого элемента.

У меня есть отлично работающий код, который издает звуковой сигнал и сбрасывает, если пользователь вводит какой-либо символ, который не соответствует регулярному выражению. (Для регулярного выражения "[0-9] +" он принимает любое количество цифр и издает звуковой сигнал, если дается буква в качестве ввода)

Но проблема в том, что я хочу проверить ввод, например "12500.00". Формат должен содержать любое количество цифр перед десятичной запятой и две цифры после десятичной запятой. например: ddd.dd

Я попробовал следующее регулярное выражение. Но я не позволяю пользователю вводить "." персонаж. Это позволяет пользователю вводить любое количество цифр, но когда "." клавиша нажата, ввод не принят.

вот регулярное выражение, которое я использовал. "[0-9] + | [0-9] +. | [0-9] +. [0-9] {1} | [0-9] +. [0-9] {2}"

важно: пользовательский ввод проверяется символ за символом, так как пользователь вводит их в поле jtext.

Вот код

import java.awt.Toolkit;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public abstract class ValidatedTextField extends PlainDocument {

private int max;
private String regExp;

public ValidatedTextField(int max, String regExp) {
    this.max = max;
    this.regExp = regExp;

}

@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
    Pattern DIGITS = Pattern.compile(regExp);
    // System.out.println(str);
    if (getLength() + str.length() > max) {
        str = str.substring(0, max - getLength());
        Toolkit.getDefaultToolkit().beep();
    }
    if (!DIGITS.matcher(str).matches() || str == null) {
        str = null;
        Toolkit.getDefaultToolkit().beep();
    }
    if (str != null && !passDependency(str)) {
        str = null;
        Toolkit.getDefaultToolkit().beep();
    }
    //str != null && DIGITS.matcher(str).matches

    super.insertString(offs, str, a);

}

public abstract boolean passDependency(String str);

public void shiftFocus(JComponent jc, boolean condition) {
    if (condition) {
        jc.requestFocusInWindow();
    }
}
}

Ниже приведен не точный код, но я так его и использую.

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.*;

public class ValidateTest {
void makeFrame(){
    JFrame jf=new JFrame("Verifier Test");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTextField text = new JTextField();
    JLabel lbl=new JLabel("Price");

    text.setDocument(new ValidatedTextField(10, "[0-9]+") {

        @Override
        public boolean passDependency(String str) {
            return true;
        }
    });
    text.setPreferredSize(new Dimension(200, 30));
    lbl.setPreferredSize(new Dimension(60, 30));
    jf.getContentPane().add(text, BorderLayout.EAST);
    jf.getContentPane().add(lbl, BorderLayout.WEST);
    jf.pack();
    jf.setVisible(true);
    text.setVisible(true);
}
public static void main(String[] args) {
    new ValidateTest().makeFrame();
}
}

Ответы [ 4 ]

1 голос
/ 29 апреля 2010

Вы делаете слишком много, и регулярное выражение не всегда является решением.

Используйте JFormattedTextField с количествомFormat

См. Учебник Sun по Java и демо

1 голос
/ 29 апреля 2010

Скорее используйте NumberFormat#parse() и поймайте ParseException.

1 голос
/ 29 апреля 2010

Выезд RegExLib

Имеет все регулярные выражения, которые вы можете придумать где-то в библиотеке, и тестер для проверки ваших собственных выражений. В сети есть и другие тестеры RegEx, это только один сайт, который мне нравится.

Простой поиск вернул следующее значение regEx: ^ [$]? [0-9] * (.)? [0-9]? [0-9]? $

1 голос
/ 29 апреля 2010
[0-9]+(?:\.[0-9]+)?

Это соответствует (по крайней мере, одной цифре) НЕОБЯЗАТЕЛЬНО СЛЕДУЕТ ЗА (один период, за которым следует хотя бы одна цифра).

...