什么是在jtextfield中验证“价格”的正则表达式

时间:2010-04-29 17:59:36

标签: java regex validation jtextfield

我想在用户输入某个项目的价格时验证jtextfield。

如果用户输入的某些字符与正则表达式不匹配,我有一个完美的代码会发出蜂鸣声并丢弃。(对于正则表达式“[0-9] +”,如果给出一个字母,它会接受任意数量的数字和哔声作为输入)

但问题是我想要验证像“12500.00”这样的输入。格式应为小数点前的任意位数和小数点后的两位数。例如:ddd.dd

我尝试了以下正则表达式。但我不允许用户输入“。”字符。它允许用户输入任意数量的数字但是“。”按键输入不被接受。

这是我使用的正则表达式。 “[0-9] + | [0-9] +。| [0-9] +。[0-9] {1} | [0-9] +。[0-9] {2}”

重要:当用户将它们输入到jtextfield时,用户输入逐字符验证。

这是代码

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 个答案:

答案 0 :(得分:1)

[0-9]+(?:\.[0-9]+)?

匹配(至少一位数)OPTIONALLY FOLLOWED BY(单个句点后跟至少一位数)。

答案 1 :(得分:1)

而是使用NumberFormat#parse()并抓住ParseException

答案 2 :(得分:1)

查看RegExLib

关于库中某处可以想到的每个正则表达式,以及验证自己表达式的测试人员。还有其他在线注册测试人员,这只是我喜欢的一个网站。

简单搜索返回以下regEx:^ [$]?[0-9] *(。)?[0-9]?[0-9]?$

答案 3 :(得分:1)

你做得太多了,正则表达式并不总是解决方案。

将JFormattedTextField与amountFormat

一起使用

请参阅Sun's Java tutorialdemo