Более простой способ гарантировать целочисленный ввод через сканер?
-
19-08-2019 - |
Вопрос
Для программы, которую я пишу, мне нужно попросить пользователя ввести целое число от 1 до 8. Я попробовал несколько (более чистых) способов сделать это, но ни один из них не сработал, поэтому у меня осталось следующее: р>
int x = 0;
while (x < 1 || x > 8)
{
System.out.print("Please enter integer (1-8): ");
try
{
x = Integer.parseInt(inputScanner.next());
}
catch(NumberFormatException e)
{
x = 0;
}
}
Где inputScanner
- Сканер. Конечно, есть лучший способ?
Решение
Сканер выполняет регулярные выражения, верно? Почему бы не проверить, соответствует ли оно & Quot; ^ [1-8] $ & Quot; первый?
Другие советы
Использование nextInt () уже является улучшением по сравнению с простым использованием метода next (). А до этого вы можете использовать hasNextInt (), чтобы избежать всех этих бесполезных исключений.
В результате чего-то вроде этого:
int x = 0;
do {
System.out.print("Please...");
if(scanner.hasNextInt()) x = scanner.nextInt();
else scanner.next();
} while (x < 1 || x > 8);
Мне пришлось сделать калькулятор графического интерфейса (работает только с целыми числами), и проблема заключалась в том, что Тесты не позволяли создавать исключения, если входные данные не были Integer. Поэтому я не мог использовать
try { int x = Integer.parseInt(input)} catch (Exception e) {dosomethingelse}
Поскольку программы Java обычно обрабатывают ввод в JTextField как строку Я использовал это:
if (input.matches("[1-9][0-9]*"){ // String.matches() returns boolean
goodforyou
} else {
dosomethingelse
}
// this checks if the input's (type String) character sequence matches
// the given parameter. The [1-9] means that the first char is a Digit
// between 1 and 9 (because the input should be an Integer can't be 0)
// the * after [0-9] means that after the first char there can be 0 - infinity
// characters between digits 0-9
надеюсь, это поможет:)
Apache Commons - твой друг. Смотрите NumberUtils.toInt (String, int)
String input;
int number;
while (inputScanner.hasNextLine())
{
input = inputScanner.nextLine();
if (input.equals("quit")) { System.exit(0); }
else
{
//If you don't want to put your code in here, make an event handler
//that gets called from this spot with the input passed in
try
{
number = Integer.parseInt(input);
if ((number < 1) || (number > 8))
{ System.out.print("Please choose 1-8: "); }
else { /* Do stuff */ }
}
catch (NumberFormatException e) { number = 0; }
}
}
Мне всегда нравится вводить полную строку, чтобы вы могли быть уверены, что пользователь нажал кнопку Enter. Если вы просто используете inputScanner.nextInt()
, вы можете поместить два int
в одну строку, и она вытянет одну, а другую - другую.
Пример кода:
int x;
Scanner in = new Scanner(System.in);
System.out.println("Enter integer value: ");
x = in.nextInt();
Массив также можно использовать для хранения целого числа.
Вы можете попробовать что-то вроде этого:
Scanner cin = new Scanner(System.in);
int s = 0;
boolean v = false;
while(!v){
System.out.print("Input an integer >= 1: ");
try {
s = cin.nextInt();
if(s >= 1) v = true;
else System.out.println("Please input an integer value >= 1.");
}
catch(InputMismatchException e) {
System.out.println("Caught: InputMismatchException -- Please input an integer value >= 1. ");
cin.next();
}
}