1

ユーザーがアイテムの価格を入力すると、jtextfield を検証したいと考えています。

ユーザーが正規表現と一致しない文字を入力すると、ビープ音を鳴らして破棄する完全に機能するコードがあります(正規表現「[0-9] +」の場合、文字が入力として与えられた場合、任意の数字とビープ音を受け入れます)

しかし問題は、「12500.00」のような入力を検証したいということです。フォーマットは、小数点の前は任意の桁数、小数点以下は 2 桁である必要があります。例: 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

4 に答える 4

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

これは、(少なくとも 1 桁の) OPTIONALLY FOLLOWED BY (1 つのピリオドの後に少なくとも 1 桁の数字が続く) に一致します。

于 2010-04-29T18:02:31.243 に答える
1

むしろ、 を使用NumberFormat#parse()してキャッチしParseExceptionます。

于 2010-04-29T18:05:07.050 に答える
1

あなたはやりすぎており、正規表現が常に解決策であるとは限りません。

amountFormat で JFormattedTextField を使用する

Sun の Java チュートリアルデモを見る

于 2010-04-29T18:30:36.483 に答える
1

RegExLibをチェックしてください

ライブラリのどこかに考えられるほぼすべての正規表現と、独自の表現を検証するテスターがあります。他にも正規表現テスターがオンライン上にありますが、これは私がたまたま気に入ったサイトの 1 つにすぎません。

簡単な検索で次の正規表現が返されました: ^[$]?[0-9]*(.)?[0-9]?[0-9]?$

于 2010-04-29T18:12:04.873 に答える