我正在System.in
使用java.util.Scanner
. 我需要验证以下内容的输入:
- 它必须是一个非负数
- 必须是字母
- ... ETC
最好的方法是什么?
我正在System.in
使用java.util.Scanner
. 我需要验证以下内容的输入:
最好的方法是什么?
Scanner.hasNextXXX
方法概述java.util.Scanner
有许多hasNextXXX
可用于验证输入的方法。以下是所有这些的简要概述:
hasNext()
- 它有任何令牌吗?hasNextLine()
- 它有另一行输入吗?hasNextInt()
- 它是否有一个可以被解析成int
?hasNextDouble()
, hasNextFloat()
, hasNextByte()
, hasNextShort()
, hasNextLong()
, 和hasNextBoolean()
hasNextBigInteger()
和hasNextBigDecimal()
Scanner
由于它基于正则表达式这一事实,它能够实现更多功能。一个重要的特性是useDelimiter(String pattern)
,它可以让您定义分隔标记的模式。还有一些忽略分隔符find
的skip
方法。
以下讨论将使正则表达式尽可能简单,因此重点仍然放在Scanner
.
这是一个简单的示例,hasNextInt()
用于验证int
输入是否为正。
Scanner sc = new Scanner(System.in);
int number;
do {
System.out.println("Please enter a positive number!");
while (!sc.hasNextInt()) {
System.out.println("That's not a number!");
sc.next(); // this is important!
}
number = sc.nextInt();
} while (number <= 0);
System.out.println("Thank you! Got " + number);
这是一个示例会话:
请输入正数!
五
这不是一个数字!
-3
请输入正数!
5
谢谢!得到 5
请注意,与更详细的/组合Scanner.hasNextInt()
相比,使用起来容易得多。根据合同,a保证如果它,那么将和平地给你那个,并且不会扔任何// 。try/catch
Integer.parseInt
NumberFormatException
Scanner
hasNextInt()
nextInt()
int
NumberFormatException
InputMismatchException
NoSuchElementException
hasNextXXX
同一个令牌上的多个请注意,上面的代码段包含一个sc.next()
用于推进Scanner
until it的语句hasNextInt()
。重要的是要意识到没有任何方法 hasNextXXX
可以 Scanner
超越任何输入!您会发现,如果您从代码段中省略这一行,那么它将在无效输入上进入无限循环!
这有两个后果:
hasNextXXX
测试的“垃圾”输入,那么您需要以Scanner
一种或另一种方式前进(例如next()
,、、nextLine()
等skip
)。hasNextXXX
测试失败,您仍然可以测试它是否可能hasNextYYY
!hasNextXXX
这是执行多个测试的示例。
Scanner sc = new Scanner(System.in);
while (!sc.hasNext("exit")) {
System.out.println(
sc.hasNextInt() ? "(int) " + sc.nextInt() :
sc.hasNextLong() ? "(long) " + sc.nextLong() :
sc.hasNextDouble() ? "(double) " + sc.nextDouble() :
sc.hasNextBoolean() ? "(boolean) " + sc.nextBoolean() :
"(String) " + sc.next()
);
}
这是一个示例会话:
5
(int) 5
false
(boolean) false
blah
(String) blah
1.1
(double) 1.1
100000000000
(long) 100000000000
退出
请注意,测试的顺序很重要。如果 a Scanner
hasNextInt()
,那么它也是hasNextLong()
,但不一定true
相反。通常,您希望在更一般的测试之前进行更具体的测试。
Scanner
具有正则表达式支持的许多高级功能。这是一个使用它来验证元音的示例。
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a vowel, lowercase!");
while (!sc.hasNext("[aeiou]")) {
System.out.println("That's not a vowel!");
sc.next();
}
String vowel = sc.next();
System.out.println("Thank you! Got " + vowel);
这是一个示例会话:
请输入元音,小写!
5
那不是元音!
z
那不是元音!
e
谢谢!得到了
在正则表达式中,作为 Java 字符串文字,模式"[aeiou]"
就是所谓的“字符类”;它匹配任何字母a
, e
, i
, o
, u
。请注意,使上述测试不区分大小写是微不足道的:只需将这样的正则表达式模式提供给Scanner
.
hasNext(String pattern)
-true
如果下一个标记与从指定字符串构造的模式匹配,则返回。java.util.regex.Pattern
Scanner
一次使用两个有时您需要逐行扫描,一行上有多个标记。实现这一点的最简单方法是使用two Scanner
,其中第二个Scanner
将nextLine()
第一个Scanner
作为输入。这是一个例子:
Scanner sc = new Scanner(System.in);
System.out.println("Give me a bunch of numbers in a line (or 'exit')");
while (!sc.hasNext("exit")) {
Scanner lineSc = new Scanner(sc.nextLine());
int sum = 0;
while (lineSc.hasNextInt()) {
sum += lineSc.nextInt();
}
System.out.println("Sum is " + sum);
}
这是一个示例会话:
在一行中给我一堆数字(或“退出”)
3 4 5
总和是 12
10 100 一百万美元
总和是 110
等等什么?
总和为 0
退出
除了Scanner(String)
构造函数之外,还有Scanner(java.io.File)
其他。
Scanner
提供了一组丰富的功能,例如hasNextXXX
验证方法。hasNextXXX/nextXXX
组合意味着 aScanner
永远不会抛出InputMismatchException
/ NoSuchElementException
。hasNextXXX
不推进Scanner
过去的任何输入。Scanner
如有必要,不要害羞地创建多个。两个简单Scanner
往往比一个过于复杂好Scanner
。Scanner
接受String pattern
参数的方法都是基于正则表达式的。
String
转换为文字模式的简单方法就是Pattern.quote
它。Here's a minimalist way to do it.
System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
要检查字符串中的字母,您可以使用正则表达式,例如:
someString.matches("[A-F]");
为了检查数字并阻止程序崩溃,我有一个非常简单的类,您可以在下面找到您可以在其中定义所需值的范围。 这里
public int readInt(String prompt, int min, int max)
{
Scanner scan = new Scanner(System.in);
int number = 0;
//Run once and loop until the input is within the specified range.
do
{
//Print users message.
System.out.printf("\n%s > ", prompt);
//Prevent string input crashing the program.
while (!scan.hasNextInt())
{
System.out.printf("Input doesn't match specifications. Try again.");
System.out.printf("\n%s > ", prompt);
scan.next();
}
//Set the number.
number = scan.nextInt();
//If the number is outside range print an error message.
if (number < min || number > max)
System.out.printf("Input doesn't match specifications. Try again.");
} while (number < min || number > max);
return number;
}
一个想法:
try {
int i = Integer.parseInt(myString);
if (i < 0) {
// Error, negative input
}
} catch (NumberFormatException e) {
// Error, not a number.
}
在commons-lang库中还有CharUtils类,它提供了isAsciiNumeric()
检查字符是否为数字以及isAsciiAlpha()
检查字符是否为字母的方法...
如果您从控制台或类似工具解析字符串数据,最好的方法是使用正则表达式。在此处阅读更多信息:http: //java.sun.com/developer/technicalArticles/releases/1.4regex/
否则,要从字符串中解析 int,请尝试 Integer.parseInt(string)。如果字符串不是数字,则会出现异常。否则,您可以然后对该值进行检查以确保它不是负数。
String input;
int number;
try
{
number = Integer.parseInt(input);
if(number > 0)
{
System.out.println("You positive number is " + number);
}
} catch (NumberFormatException ex)
{
System.out.println("That is not a positive number!");
}
要获得仅字符的字符串,您可能会更好地循环检查数字的每个字符,例如使用Character.isLetter(char)。
String input
for(int i = 0; i<input.length(); i++)
{
if(!Character.isLetter(input.charAt(i)))
{
System.out.println("This string does not contain only letters!");
break;
}
}
祝你好运!
我尝试过的是,首先我接受整数输入并检查它是否为负数,如果它为负数,然后再次接受输入
Scanner s=new Scanner(System.in);
int a=s.nextInt();
while(a<0)
{
System.out.println("please provide non negative integer input ");
a=s.nextInt();
}
System.out.println("the non negative integer input is "+a);
在这里,您需要先进行字符输入,然后检查用户是否输入了字符,如果没有则再次进行字符输入
char ch = s.findInLine(".").charAt(0);
while(!Charcter.isLetter(ch))
{
System.out.println("please provide a character input ");
ch=s.findInLine(".").charAt(0);
}
System.out.println("the character input is "+ch);