Если вы анализируете строковые данные с консоли или аналогичного средства, лучший способ - использовать регулярные выражения. Подробнее об этом читайте здесь: 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)
{
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;
}
}
Удачи!
Одна идея:
try {
int i = Integer.parseInt(myString);
if (i < 0) {
// Error, negative input
}
} catch (NumberFormatException e) {
// Error, not a number.
}
В библиотеке commons-lang также есть класс CharUtils , который предоставляет методы isAsciiNumeric ()
, чтобы проверить, что символ является числом, и isAsciiAlpha ()
, чтобы проверить, что символ является буквой ...
Scanner.hasNextXXX
методов java.util.Scanner
имеет многие методы hasNextXXX
, которые можно использовать для проверки ввода.Вот краткий обзор всех из них:
hasNext ()
- есть ли у него какой-либо токен? hasNextLine ()
- есть ли еще одна строка ввода ? hasNextInt ()
- есть ли у него токен, который можно проанализировать в int
? hasNextDouble ()
, hasNextFloat ( )
, hasNextByte ()
, hasNextShort ()
, hasNextLong ()
и hasNextBoolean ()
hasNextBigInteger ()
и hasNextBigDecimal ()
hasNext (шаблон строки)
hasNext (шаблон шаблона)
является перегрузкой Pattern.compile
Сканер
способен на большее, благодаря тому, что это регулярное выражение -на основании. Одной из важных функций является 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 ()
по сравнению с более подробным try / catch
Integer.parseInt
/ NumberFormatException
комбо. По контракту сканер
гарантирует , что если он hasNextInt ()
, то nextInt ()
мирно предоставит вам int
, и не вызовет какое-либо NumberFormatException
/ InputMismatchException
/ NoSuchElementException
.
hasNextXXX
на одном токене Обратите внимание, что приведенный выше фрагмент содержит инструкцию sc.next ()
для продвижения сканера
, пока не будет hasNextInt ()
. Важно понимать, что ни один из hasNextXXX
методов не продвигает Scanner
мимо любого ввода! Вы обнаружите, что если вы опустите эту строку из сниппета, это приведет к бесконечному циклу при недопустимом вводе!
Это имеет два последствия:
hasNextXXX
, то вам нужно продвинуть Scanner
так или иначе (например next ()
, nextLine ()
, пропустить
и т. Д.). 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
(логическое) false
blah
(String) blah
1.1
(double ) 1.1
100000000000
(длинный) 100000000000
exit
Обратите внимание, что порядок тестов имеет значение. Если сканер
hasNextInt ()
, то он также hasNextLong ()
, но он не обязательно истинный
наоборот. Чаще всего вы захотите провести более конкретный тест перед более общим.
Сканер
имеет множество дополнительных функций, поддерживаемых регулярными выражениями. Вот пример его использования для проверки гласных.
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
Спасибо! Got e
В регулярном выражении в виде строкового литерала Java шаблон «[aeiou]»
- это то, что называется «классом символов»; он соответствует любой из букв a
, e
, i
, o
, u
. Обратите внимание, что сделать вышеуказанный тест нечувствительным к регистру просто тривиально: просто предоставьте такой шаблон регулярного выражения сканеру
.
hasNext (шаблон строки)
- возвращает истину
, если следующий токен совпадает с шаблоном, созданным из указанной строки. java.util.regex.Pattern
сканеров
одновременно Иногда вам нужно сканировать построчно, с несколькими маркерами в строке. Самый простой способ сделать это - использовать два сканера
, где второй сканер
берет nextLine ()
из первого сканера
в качестве входных данных. Вот пример:
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
exit
В дополнение к конструктору Scanner (String)
, есть также Scanner (java.io .File)
среди других.
Сканер
предоставляет богатый набор функций, таких как методы hasNextXXX
для проверки. hasNextXXX / nextXXX
означает, что Сканер
НИКОГДА не будет генерировать исключение InputMismatchException
/ NoSuchElementException
. hasNextXXX
не продвигает Сканер
за пределы любого ввода. сканеров
. Два простых сканера
часто лучше, чем один слишком сложный сканер
. сканера
, который принимает аргумент String pattern
, основан на регулярных выражениях.
String
в буквальный шаблон - это Pattern.quote
it.