Проверка целого числа или строки без try-catch - PullRequest
1 голос
/ 21 марта 2010

Хорошо, я потерян. Мне необходимо выяснить, как проверить целое число, но по какой-то глупой причине я не могу использовать метод Try-Catch. Я знаю, что это самый простой способ, и поэтому все решения в Интернете используют его.

Я пишу на Java.

Дело в том, что мне нужно, чтобы кто-то ввел числовой идентификатор и имя строки. Если один из двух входов неверен, я должен сказать им, что они допустили ошибку.

Может ли кто-нибудь мне помочь?

Ответы [ 7 ]

5 голосов
/ 21 марта 2010

Если я вас правильно понимаю, вы читаете целое число или строку из стандартного ввода в виде строк и хотите проверить, что целое число на самом деле является целым числом. Возможно, ваша проблема в том, что Integer.parseInt () , который можно использовать для преобразования String в целое число, создает NumberFormatException . Похоже, что ваше назначение запретило использование обработки исключений (правильно ли я понял), и поэтому вам не разрешено использовать эту встроенную функцию, и вы должны реализовать ее самостоятельно.

Ok. Итак, поскольку это домашнее задание, я не собираюсь давать вам полный ответ, но вот псевдокод:

let result = 0 // accumulator for our result
let radix = 10 // base 10 number
let isneg = false // not negative as far as we are aware

strip leading/trailing whitespace for the input string

if the input begins with '+':
    remove the '+'
otherwise, if the input begins with '-':
    remove the '-'
    set isneg to true

for each character in the input string:
    if the character is not a digit:
        indicate failure
    otherwise:
        multiply result by the radix
        add the character, converted to a digit, to the result

if isneg:
     negate the result

report the result

Ключевым моментом здесь является то, что каждая цифра в разы важнее, чем цифра непосредственно справа от нее, и поэтому, если мы всегда умножаем на основание при сканировании строки слева направо, то каждой цифре присваивается правильное значение. , Теперь, если я ошибаюсь, и вы на самом деле можете использовать try-catch, но просто не поняли, как:

int result = 0;
boolean done = false;
while (!done){
     String str = // read the input
     try{
         result = Integer.parseInt(str);
         done = true;
     }catch(NumberFormatException the_input_string_isnt_an_integer){
         // ask the user to try again
     }
}  
3 голосов
/ 21 марта 2010

Не совсем точно, если проверяемый String должен проверять, содержит ли содержимое только числа, или может фактически быть представлен в допустимом диапазоне int, один из способов решения этой проблемы - перебрать символы String и убедитесь, что символы состоят только из цифр.

Так как это, кажется, домашнее задание, вот немного псевдокода:

define isANumber(String input):
  for (character in input):
    if (character is not a number):
      return false

  return true
2 голосов
/ 02 апреля 2012

Я использую Java 1.6, и это работает для меня:

if (yourStringVariable.trim().matches("^\\d*$"))

тогда у вас есть положительное целое число

1 голос
/ 23 марта 2010

Вы можете использовать java.util.Scanner и hasNextInt(), чтобы проверить, можно ли преобразовать String в int без исключения.

В качестве дополнительной функции,он может пропускать пробелы и допускает дополнительный мусор (который можно проверить).

String[] ss = {
   "1000000000000000000",
   "  -300  ",
   "3.14159",
   "a dozen",
   "99 bottles of beer",
};
for (String s : ss) {
   System.out.println(new Scanner(s).hasNextInt());
} // prints false, true, false, false, true

См. также: Как сохранить сканер от выдачи исключений при вводе неправильного типа?

0 голосов
/ 21 марта 2010
public static boolean IsNumeric(String s)
{
    if (s == null)
        return false;
    if (s.length() == 0)
        return false;
    for (int i = 0; i < s.length(); i++)
    {
        if (!Character.isDigit(s.charAt(i)))
            return false;
    }
    return true;
}     
0 голосов
/ 21 марта 2010
Pattern p = Pattern.compile("\\d{1,}");
Matcher m = p.matcher(inputStr); 
boolean isNumber = false;

if (m.find()) {
    isNumber = true;   
}
0 голосов
/ 21 марта 2010

Посмотрите на методы hasNext в Scanner . Обратите внимание, что существуют методы для каждого типа (например, hasNextBigDecimal ), а не только hasNext.

РЕДАКТИРОВАТЬ: Нет, при неправильном вводе это не сработает, только если сканер преждевременно закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...