Java,确保用户不在字符串中输入数字

时间:2013-02-06 17:27:05

标签: java swing numbers pattern-matching joptionpane

我正在尝试用Java创建一个基于文本的游戏,我会要求用户的名字并将其插入到游戏中。我正在尝试用他们输入的字符串评估任何数字。即09452asdf1234

以下是与问题相关的代码。

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字符串中输入数字的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

您可以使用更简单的检查:

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

replaceAll调用将删除name中的所有数字。只有在没有要移除的数字时,equals检查才会成功。

请注意,在这种情况下抛出NumberFormatException会产生误导,因为异常具有非常不同的含义。

答案 1 :(得分:2)

考虑使用JFormattedTextField或输入验证程序来阻止用户首先输入数字。对于一次性项目,可能不值得失去JOptionPane的简单性,但它简化了最终用户的工作。

答案 2 :(得分:2)

或者,您只是不允许用户在textField中添加任何数值。因此,您需要创建自定义PlainDocumentNonNumericDocument并设置{{1 JTextField对象的自定义Document

NonNumericDocument

您可以将此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(); } }); } } 与代码中的任何JTextField一起使用,而无需担心明确处理NonNumericDocument个字符。

答案 3 :(得分:0)

如果您想让用户只输入字母,您可以这样做:

if (name.matches("\\p{Alpha}+")) {
    // name contains only letters
}

答案 4 :(得分: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;
}