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

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

Этот вопрос возникает наверное у каждого начинающего (и не очень) программиста на java. Есть несколько способов выполнить вышеописанную задачу.
Способ первый - использование метода Integer.parseInt(String string).
public boolean checkString(String string) {
        try {
            Integer.parseInt(string);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
Этот способ очень быстро выполняется если строка является числом (в 5-10 раз быстрее, чем способ с использованием регулярных выражений), и очень долго - если строка числом не является (примерно в 1,5 раз дольше, чем способ с использованием регулярных выражений).

Способ второй - использование регулярных выражений.
public boolean checkString(String string) {
        if (string == null) return false;
        return string.matches("^-?\\d+$");
    }

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

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

public boolean checkString(String string) {
         if (string == null || string.length() == 0) return false;

         int i = 0;
         if (string.charAt(0) == '-') {
            if (string.length() == 1) {
               return false;
            }
            i = 1;
         }

         char c;
         for (; i < string.length(); i++) {
             c = string.charAt(i);
             if (!(c >= '0' && c <= '9')) {
                 return false;
             }
         }
         return true;
     }

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

12 комментариев:

  1. А 3й метод = true при string="-"?

    ОтветитьУдалить
  2. Спасибо, помогло на лабе)

    ОтветитьУдалить
  3. а как узнать является ли первый символ числом и если да, то его запомнить ?

    ОтветитьУдалить
    Ответы
    1. не совсем понятно что значит запомнить, но если предположить что это то же самое что вывести то код будет примерно такой

      String x = "5agg";// проверяемая строка
      char c = x.charAt(0);
      if (c >= '0' && c <= '9') {
      System.out.println(c);
      }

      Удалить
  4. Лучше так
    Character.isDigit(x.charAt(i))

    ОтветитьУдалить
  5. Нужна ваша помощь!
    У меня задание, где нужно вести числа в отдельном методе. Обернуть тело метода в try..catch, если введены буквы, нужно перехватить исключение и вывести на экран все введенные числа. Мне нужна проверка каждого символа. У вас в примере 3 проверка идет строки типа String , а у меня проверка должна быть с строки типа int a = Integer.parseInt(reader.readLine());. Но с переменной "а" я не могу вызвать функцию charAt. Что я не так делаю?

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. Интересные вы, ребята, задачи решаете! Найти бы в команду собраться таких..

    ОтветитьУдалить
  8. ОХ ты ж.. сколько лет прошло, уже решая новые задачи, спустя столько опыта и выполненных задач, и снова сюда вернулся ))

    А всё потому, что ищу простой способ быстро корректировать вхождение чисел-строк в метод.

    ОтветитьУдалить

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)