我正在尝试用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
字符串中输入数字的最佳方法是什么?
答案 0 :(得分:3)
您可以使用更简单的检查:
if (!name.replaceAll("[0-9]", "").equals(name)) {
// name contains digits
}
replaceAll
调用将删除name
中的所有数字。只有在没有要移除的数字时,equals
检查才会成功。
请注意,在这种情况下抛出NumberFormatException
会产生误导,因为异常具有非常不同的含义。
答案 1 :(得分:2)
考虑使用JFormattedTextField
或输入验证程序来阻止用户首先输入数字。对于一次性项目,可能不值得失去JOptionPane的简单性,但它简化了最终用户的工作。
答案 2 :(得分:2)
或者,您只是不允许用户在textField
中添加任何数值。因此,您需要创建自定义PlainDocument
说NonNumericDocument
并设置{{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;
}