我得到了一个练习,使用一种方法询问用户的名字。如果用户未输入任何文本,则应再次询问他们。我已经让它工作了,但如果用户输入一个数字,它仍然会打印出来。如何阻止用户输入号码?
这是我下面的代码
public static void main(String[] args) {
// call method
System.out.println("Hello " + getName());
}
public static String getName() {
// input a scanner
Scanner scanner = new Scanner(System.in);
// declare vars
String userName = "";
// while loop
while (userName.equals("")) {
// ask user for input
System.out.println("What is your name?");
userName = scanner.nextLine();
}
scanner.close();
return userName;
}
}
使用正则表达式的最佳方式。
String namePattern = "[^\p{P}|^\d+]+";
//true if name contains only alphabets, false - otherwise
boolean result = userName.matches(namePattern);
由于正则表达式通常很慢,因此非正则表达式解决方案将是:
boolean containsDigit(final String string) {
boolean result = false;
if (string == null || string.isEmpty()) {
return result;
}
char[] characters = string.toCharArray();
for (char character : characters) {
if (Character.isDigit(character)) {
result = true;
break;
}
}
return result;
}
这将导致以下 while 循环
while (userName.equals("") || containsDigit(userName)) {
...
}
注意:更清洁的替代方案是使用username.isEmpty()
而不是username.equals("")
可以的话,你也可以使用像ApacheCommons
这样的第三方库,并使用他们的StringUtils.isAlpha()
方法。
isAlpha()
方法还会检查提供的字符串是null
还是空。
Well Scanner有几种方法来处理用户输入。可用于检查用户输入是否为int
的方法之一是hasNextInt()
:
如果可以使用 nextInt() 方法将此扫描程序输入中的下一个标记解释为指定基数中的 int 值,则返回 true。
所以你的代码将是:
if(!scanner.hasNextInt()){
userName = scanner.nextLine();
}
另一种方法是将hasNext(Pattern)
方法与仅匹配字母字符串的模式一起使用。