【问题标题】:What is the regular expression for valdating a 'price' in a jtextfield在 jtextfield 中验证“价格”的正则表达式是什么
【发布时间】:2011-02-13 22:34:15
【问题描述】:

我想在用户输入某些商品的价格时验证 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();
}
}

【问题讨论】:

    标签: java regex validation jtextfield


    【解决方案1】:

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

    使用带有 amountFormat 的 JFormattedTextField

    Sun's Java tutorialdemo

    【讨论】:

    • 非常感谢您使用 JFormattedTextField 更容易。节省了我很多时间
    【解决方案2】:
    [0-9]+(?:\.[0-9]+)?
    

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

    【讨论】:

    • 在小数点后强制使用 2 位数字(使用 {2} 而不是 +)不是更好吗(对于 $、£、€ 这总是正确的,并在问题中说明如果指定,价格将始终有 2 位小数)。
    • 这不接受“。”特点。请注意,字符是一一输入的。在每个字符输入处验证文本 如果我猜一次匹配整个字符串,则此方法有效。(如果我的代码没有错误,我发布了我的代码)谢谢您的关注
    【解决方案3】:

    宁可使用NumberFormat#parse() 并抓住ParseException

    【讨论】:

      【解决方案4】:

      查看RegExLib

      在库中的某个地方,您可以想到几乎所有的正则表达式,并有一个测试器来验证您自己的表达式。还有其他在线正则表达式测试器,这只是我碰巧喜欢的一个站点。

      简单的搜索返回以下正则表达式:^[$]?[0-9]*(.)?[0-9]?[0-9]?$

      【讨论】:

      • 感谢您的链接。你提供的正则表达式没有做我想做的事情。它允许字母被接受为有效输入。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2018-12-11
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多