Java проверка на ввод числа

Я беру ввод пользователя с System.in с помощью java.util.Scanner . Мне нужно проверить вход для таких вещей, как:

  • Это должно быть неотрицательное число
  • Это должно быть алфавитная буква
  • . и т.д.

Какой лучший способ сделать это?

Обзор методов 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 на входе.

      Вот пример сеанса:

      Введите положительное число!
      пять
      Это не число!
      -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 .

      Вот пример сеанса:

      5
      (int) 5
      ложь
      (boolean) false
      бла
      (String) blah
      1.1
      (двойной) 1.1
      100000000000
      (длинный) 100000000000
      выход

      Обратите внимание, что порядок испытаний имеет значение. Если a Scanner hasNextInt() , то это также hasNextLong() , но это не обязательно true наоборот. Чаще всего вы хотите сделать более конкретный тест перед более общим тестом.

      Пример 3: Проверка гласных

      Scanner имеет множество расширенных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.

      Вот пример сеанса:

      Введите гласный, в нижнем регистре!
      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 в качестве входного. Вот пример:

      Вот пример сеанса:

      Дайте мне кучу чисел в строке (или "exit" )
      3 4 5
      Сумма составляет 12
      10 100 млн. Долларов

      Сумма составляет 110
      ждать, что? Сумма 0
      Выход

      Написал программу, которая принимает два числа, а потом оперирует. Но если я ввожу букву, то выдаёт ошибку, как сделать так, чтобы если вводил не цифры, то заново выводило сообщение на ввод числа, а не выдавало ошибку? Спасибо.

      1 ответ 1

      Пример взят из http://kostin.ws/java/java-input-stream.html — первая же ссылка в гугле по вопросу "java scanner описание"

      Всё ещё ищете ответ? Посмотрите другие вопросы с метками scanner или задайте свой вопрос.

      Похожие

      Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

      дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.14.35771

      Блог, посвященный программированию и сисадминистрированию

      четверг, 7 июля 2011 г.

      Как можно проверить является ли строка числом на java?

      Этот вопрос возникает наверное у каждого начинающего (и не очень) программиста на java. Есть несколько способов выполнить вышеописанную задачу.
      Способ первый — использование метода Integer.parseInt(String string).
      Этот способ очень быстро выполняется если строка является числом (в 5-10 раз быстрее, чем способ с использованием регулярных выражений), и очень долго — если строка числом не является (примерно в 1,5 раз дольше, чем способ с использованием регулярных выражений).

      Способ второй — использование регулярных выражений.

      Этот метод выполняется примерно с одинаковой скоростью вне зависимости от того является ли строка числом.

      Способ третий — проверка по очереди каждого символа в строке.

      При тестировании данный метод показал на удивление хорошие результаты — более чем в 3 раза быстрее, чем самый быстрый случай для первого и второго метода.
      Третий метод и второй для преобрахования строк не подходят, в отличие от первого (при небольшой доработке).
      Поэтому если задача стоит только в определении является ли строка числом — то лучше всего подойдет именно третий метод, если же помимо прочего ещё и необходимо преобразовать строку в число то лучше воспользоваться 1 методом, немного видоизменив его.

      Оцените статью
      Ремонт оргтехники
      Добавить комментарий