2

Javaでテキストベースのゲームを作成しようとしています。このゲームでユーザーの名前を尋ね、ゲームに挿入します。入力した文字列に任意の数字を付けて評価しようとしています。すなわち09452またはasdf1234

これが問題に関連するコードです。

String name, choiceSelection;
int choice;
name = JOptionPane.showInputDialog(null, "Enter your name!");

//CHECKS IF USER ENTERED LETTERS ONLY
if (Pattern.matches("[0-9]+", name))
{
    throw new NumberFormatException();
} 
else if (Pattern.matches("[a-zA-Z]+", name)) 
{
    if (Pattern.matches("[0-9]+", name))
    {
        throw new NumberFormatException();
    }
}

文字列に数字が含まれているかどうかを調べようとしてNumberFormatExceptionいます。含まれている場合は、正しいプロンプトに従わなかったことを知らせるためにをスローします。

nameユーザーが文字列に数字を入力しないようにするための最良の方法は何ですか?

4

5 に答える 5

3

より簡単なチェックを使用できます。

if (!name.replaceAll("[0-9]", "").equals(name)) {
    // name contains digits
}

呼び出しにより、replaceAllからすべての数字が削除されますname。チェックは、equals削除する数字がない場合にのみ成功します。

この場合のスローNumberFormatExceptionは、例外の意味が大きく異なるため、誤解を招く可能性があることに注意してください。

于 2013-02-06T17:29:32.690 に答える
2

または、ユーザーに数値を入力させないでください。そのためには、Customized sayを作成し、JTextFieldオブジェクトをカスタマイズされたものとして設定するtextField必要があります。PlainDocumentNonNumericDocumentDocumentNonNumericDocument

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;

class NonNumericDocument extends PlainDocument 
{
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException 
    {
        if (str == null) 
        {
            return;
        }
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) 
        {
            if (Character.isDigit(arr[i]) || !Character.isLetter(arr[i]))//Checking for Numeric value or any special characters
            {
                return;
            }
        }
        super.insertString(offs, new String(str), a);
    }
}
//How to use NonNumericDocument
class  TextFrame extends JFrame
{
    JTextField tf ;
    public void prepareAndShowGUI()
    {
        tf = new JTextField(30);
        tf.setDocument(new NonNumericDocument());//Set Document here.
        getContentPane().add(tf,BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater ( new Runnable()
        {
            @Override
            public void run()
            {
                TextFrame tFrame = new TextFrame();
                tFrame.prepareAndShowGUI();
            }
        });
    }
}

これは、文字の明示的なNonNumericDocument処理を気にすることなく、コード内の任意のJTextFieldで使用できます。non-numeric

于 2013-02-06T17:52:01.957 に答える
2

JFormattedTextFieldまたは入力ベリファイアを使用して、ユーザーが最初に数値を入力できないようにすることを検討してください。使い捨てプロジェクトのJOptionPaneの単純さを失う価値はないかもしれませんが、エンドユーザーにとっては単純化されます。

于 2013-02-06T17:45:47.560 に答える
0

ユーザーが文字のみを入力できるようにする場合は、次のようにします。

if (name.matches("\\p{Alpha}+")) {
    // name contains only letters
}
于 2013-02-06T17:37:44.483 に答える
0

それを確認する別の方法は、parseInt( String s )メソッドを使用することです。

private boolean isNumber( String s ) {
    try {
        Integer.parseInt( s );
    } catch ( Exception e ) {
        return false; // if it is not a number it throws an exception
    }
    return true;
}
于 2013-02-06T18:14:12.917 に答える