- Проверка ввода с помощью java.util.Scanner
- ОТВЕТЫ
- Ответ 1
- Обзор методов Scanner.hasNextXXX
- Пример 1: Проверка положительных целых чисел
- Ссылки API
- Связанные вопросы
- Ссылки
- Пример 4. Использование двух Scanner сразу
- Резюме
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Как сделать проверку на ввод?
- Решение
- Как проверять введенные данные в консоль на наличие символа "?"
Проверка ввода с помощью java.util.Scanner
Я беру ввод пользователя с System.in с помощью java.util.Scanner . Мне нужно проверить вход для таких вещей, как:
- Это должно быть неотрицательное число
- Это должно быть алфавитная буква
- . и т.д.
Какой лучший способ сделать это?
ОТВЕТЫ
Ответ 1
Обзор методов Scanner.hasNextXXX
java.util.Scanner имеет много методов hasNextXXX , которые могут использоваться для проверки ввода. Вот краткий обзор всех из них:
- hasNext() — у него есть любой токен вообще?
- hasNextLine() — есть ли еще одна строка ввода?
- Для Java-примитивов
- hasNextInt() — у него есть токен, который можно разобрать в int ?
- Также доступны hasNextDouble() , hasNextFloat() , hasNextByte() , hasNextShort() , hasNextLong() и hasNextBoolean()
- В качестве бонуса также есть hasNextBigInteger() и hasNextBigDecimal()
- Интегральные типы также имеют перегрузки для указания оснований (например, шестнадцатеричных)
- hasNext(String pattern)
- hasNext(Pattern pattern) — это Pattern.compile перегрузка
Scanner способен к большему, включенному тем, что он основан на регулярном выражении. Важной особенностью является useDelimiter(String pattern) , которая позволяет определить, какой шаблон разделяет ваши токены. Существуют также методы find и skip , которые игнорируют разделители.
Следующее обсуждение будет поддерживать регулярное выражение как можно более простым, поэтому фокус остается на Scanner .
Пример 1: Проверка положительных целых чисел
Вот простой пример использования 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 not a number!"); sc.next(); // this is important! >number = sc.nextInt(); > while (number
Введите положительное число!
пять
Это не число!
-3
Введите положительное число!
5
Спасибо! Получил 5Заметьте, насколько проще Scanner.hasNextInt() использовать по сравнению с более подробными try/catch Integer.parseInt / NumberFormatException комбо. По контракту a Scanner гарантирует, что если он hasNextInt() , то nextInt() мирно предоставит вам int и не будет бросать никаких NumberFormatException / InputMismatchException / NoSuchElementException .
Связанные вопросы
Пример 2: Несколько hasNextXXX на одном и том же токене
Обратите внимание, что вышеприведенный фрагмент содержит инструкцию sc.next() для продвижения Scanner до тех пор, пока не будет hasNextInt() . Важно понимать, что ни один из методов hasNextXXX не продвигает Scanner мимо любого ввода!. Вы обнаружите, что если вы опустите это line из фрагмента, затем он перейдет в бесконечный цикл на недопустимом вводе!
- Если вам нужно пропустить вход "мусор", который не прошел тест hasNextXXX , вам необходимо заранее продвинуть Scanner (например, next() , nextLine() , skip и т.д.)).
- Если один тест hasNextXXX завершился с ошибкой, вы все равно можете проверить, возможно ли это hasNextYYY !
Здесь приведен пример выполнения нескольких тестов hasNextXXX .
Scanner sc = new Scanner(System.in); while (!sc.hasNext("exit"))
5
(int) 5
ложь
(boolean) false
бла
(String) blah
1.1
(двойной) 1.1
100000000000
(длинный) 100000000000
выходОбратите внимание, что порядок испытаний имеет значение. Если a Scanner hasNextInt() , то это также hasNextLong() , но это не обязательно true наоборот. Чаще всего вы хотите сделать более конкретный тест перед более общим тестом.
Пример 3: Проверка гласных
Scanner имеет множество расширенных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.
Scanner sc = new Scanner(System.in); System.out.println("Please enter a vowel, lowercase!"); while (!sc.hasNext("[aeiou]")) < System.out.println("That not a vowel!"); sc.next(); >String vowel = sc.next(); System.out.println("Thank you! Got " + vowel);
Введите гласный, в нижнем регистре!
5
Это не гласный!
г
Это не гласный!
е
Спасибо! Получил eВ regex, как строковый литерал Java, шаблон "[aeiou]" - это так называемый "класс символов"; он соответствует любой из букв a , e , i , o , u . Обратите внимание, что это тривиально, чтобы сделать вышеупомянутый тест нечувствительным к регистру: просто укажите такой шаблон регулярного выражения на Scanner .
Ссылки API
- hasNext(String pattern) - возвращает true , если следующий токен совпадает с шаблоном, построенным из указанной строки.
- java.util.regex.Pattern
Связанные вопросы
Ссылки
Пример 4. Использование двух Scanner сразу
Иногда вам нужно сканировать строки за строкой, с несколькими токенами на линии. Самый простой способ сделать это - использовать два 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); >
Дайте мне кучу чисел в строке (или "exit" )
3 4 5
Сумма составляет 12
10 100 млн. ДолларовСумма составляет 110
ждать, что? Сумма 0
ВыходВ дополнение к Scanner(String) constructor, также Scanner(java.io.File) и др.
Резюме
- Scanner предоставляет богатый набор функций, таких как hasNextXXX методы для проверки.
- Правильное использование hasNextXXX/nextXXX в комбинации означает, что Scanner будет НИКОГДА не вывести InputMismatchException / NoSuchElementException .
- Всегда помните, что hasNextXXX не продвигает Scanner мимо любого ввода.
- Не стесняйтесь создавать несколько Scanner , если это необходимо. Два простых Scanner часто лучше, чем один сложный Scanner .
- Наконец, даже если у вас нет планов использовать расширенные функции регулярного выражения, имейте в виду, какие методы основаны на регулярных выражениях, а какие нет. Любой метод Scanner , который принимает аргумент String pattern , основан на регулярном выражении.
- Совет: простой способ превратить любой String в литеральный шаблон - Pattern.quote it.
Ответ 2
Для проверки строк для букв вы можете использовать регулярные выражения, например:
Для проверки номеров и остановки сбой программы, у меня есть довольно простой класс, который вы можете найти ниже, где вы можете определить диапазон значений, которые вы хотите. Здесь
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; >
Ответ 3
Здесь минималистский способ сделать это.
System.out.print("Please enter an integer: "); while(!scan.hasNextInt()) scan.next(); int demoInt = scan.nextInt();
Ответ 4
try < int i = Integer.parseInt(myString); if (i < 0) < // Error, negative input >> catch (NumberFormatException e) < // Error, not a number. >
В commons-lang библиотека CharUtils класс, который предоставляет методы isAsciiNumeric() , чтобы проверить, что символ является числом, и isAsciiAlpha() , чтобы проверить, что символ является буквой.
Ответ 5
Если вы разбираете строковые данные с консоли или аналогичные, лучший способ - использовать регулярные выражения. Подробнее об этом читайте здесь: http://java.sun.com/developer/technicalArticles/releases/1.4regex/
В противном случае, чтобы проанализировать int из строки, попробуйте Integer.parseInt(строка). Если строка не является числом, вы получите исключение. Кроме того, вы можете выполнить свои проверки на это значение, чтобы убедиться, что оно не является отрицательным.
String input; int number; try < number = Integer.parseInt(input); if(number >0) < System.out.println("You positive number is " + number); >> catch (NumberFormatException ex)
Чтобы получить строку только для символов, вам, вероятно, будет лучше зацикливаться на каждом символе, проверяющем цифры, используя, например, Character.isLetter(char).
String input for(int i = 0; i >
Ответ 6
что я пробовал, так это то, что сначала я взял целочисленный ввод и проверил, является ли его отрицательным или нет, если его отрицательный снова принимает вход
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);
Как сделать проверку на ввод?
Как сделать проверку на ввод?
Всем здравствуйте. Хочу проверить число на его правильно. Число типа int. Если во время ввода -.Как сделать проверку на ввод? С++
y=2*(tgx+sinx/2); tgx стремится к бесконечности когда cos(x) стремится к нулю надо сделать.Как сделать проверку на ввод символов?
есть строка, в которую нужно вводить числовое значение, а пользователь вводит буквы. при вводе букв.Как сделать проверку на ввод символов
program zadacha1; uses crt; var A:array of real; i, j, n, m: integer; .1 2 3 4 5 6 7 8 9 10 11 12
Scanner sc = new Scanner(System.in); int i; while (true) { System.out.print("Введите число: "); try { i = Integer.parseInt(sc.next()); System.out.println("Ваше число : " + i); break; } catch (NumberFormatException e) { System.out.println("Неверный ввод!"); } }
Cпасибо. Еще вопрос. К примеру если у меня несколько чисел, то такую проверку делать отдельно для каждого числа?
Сообщение было отмечено TimSkokov как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
public class Cyber { public static void main(String[] args) { int a = userInput("Ведите а:"); int b = userInput("Ведите b:"); int c = userInput("Ведите c:"); //. } private static int userInput(String message) { Scanner sc = new Scanner(System.in); int i; while (true) { System.out.print(message); try { i = Integer.parseInt(sc.next()); break; } catch (NumberFormatException e) { System.out.println("Неверный ввод!"); } } return i; } }
Как сделать проверку на ввод в классе?
В методе класса не получается сделать ошибку при вводе числа меньшего нуля. Записано все верно.Как сделать проверку на ввод чисел?
Т.е. есть поле, и нужно сделать такую проверку чтобы в это поле можно было вбивать только числовые.Как сделать проверку на ввод даты?
using System; using System.Collections.Generic; using System.Linq; using System.Text; .Как проверять введенные данные в консоль на наличие символа "?"
Задание 1: Разработать программу, которая решает такую задачу.
Программа принимает в командной строке как параметры несколько строк символов. Если в каком-либо из этих строк найден символ '?', То следует прервать обработку этого аргумента, вывести сообщение о найденном символ с указанием номера аргумента и продолжить обработку аргументов, которые остались.
Задача 2: Несколько изменим программу из предыдущего задания.
Программа принимает в командной строке как параметры несколько строк символов. если в
каком-либо из этих строк найден символ '?', то следует прервать обработку параметров
командной строки и вместе с сообщением о найденном символ вывести ответ
параметр.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
import java.util.Scanner; public class sr4 { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s5 = "?"; while(in.hasNext()) { String s1 = in.next(); //if(s1.equals(s5)) if(s1.matches("^(?)$")) { System.out.println("Нашел знак вопроса здесь " +s1); break; } } } }
Напишите программу на JAVA:которая в строке "а роза упала на лапу азора" находит символ "У" и печатает символы строки до следующего символа "у"
Помогите пожалуйста решить 1) Напишите программу на JAVA:которая в строке "а роза упала на лапу.В заданной строке дописать после каждого символа "*" символ " "
В заданной строке дописать после каждого символа "*" символ " "JSP. Вставить данные в "" через "$"
Всем привет! У меня имеется jsp страница, в которой я завожу новый диск. После нажатия "submit".KeyListener, стереть символы, введенные в поле "логин"
Есть поля ввода "Логин" Box box1 = Box.createHorizontalBox(); JLabel loginLabel = new.for (int i = 0; i args.length; i++) { if (args[i].contains("?")) { System.out.println(String.format("%s:%d", args[i], i)); } }
Программно выставить "Проверять наличие обновлений сохраненных страниц" в настройках IE
В настройках IE поставил в пункте "Проверять наличие обновлений сохраненных страниц" на "при каждом.UnitPay: проверять наличие платежа и выдавать "оплата успешно" + paymentId?
Здравствуйте. Кто поможет сделать скрипт, который будет проверять наличие платежа и в конце.Как проверять введенные пользователем данные?
При заполнении формы юзер вводит данные. Чтобы сервак не взломали, рекомендуется проверять данные.Определить наличие в массиве символа, имеющего номер "контрольное число"
Дан массив, состоящий из 15 символов. Содержимое массива сортируется по убыванию. После этого.