Какой лучший способ проверить, представляет ли String целое число в Java? - PullRequest
194 голосов
/ 26 октября 2008

Обычно я использую следующую идиому, чтобы проверить, можно ли преобразовать строку в целое число.

public boolean isInteger( String input ) {
    try {
        Integer.parseInt( input );
        return true;
    }
    catch( Exception e ) {
        return false;
    }
}

Это только я, или это кажется немного хакерским? Какой способ лучше?


См. Мой ответ (с оценками, основанными на предыдущем ответе от CodingWithSpike ), чтобы увидеть, почему я изменил свою позицию и принял ответ Джонаса Клемминга к этой проблеме. Я думаю, что этот оригинальный код будет использоваться большинством людей, потому что он быстрее реализуется и более удобен в обслуживании, но он на несколько порядков медленнее, когда предоставляются нецелые данные.

Ответы [ 35 ]

6 голосов
/ 14 декабря 2012

Вы можете использовать метод совпадений класса string. [0-9] представляет все возможные значения, + означает, что длина должна быть не менее одного символа, а * означает, что длина может быть равна нулю или более.

boolean isNumeric = yourString.matches("[0-9]+"); // 1 or more characters long, numbers only
boolean isNumeric = yourString.matches("[0-9]*"); // 0 or more characters long, numbers only
4 голосов
/ 23 марта 2017

Это вариант ответа Джонаса Клемминга на Java 8:

public static boolean isInteger(String str) {
    return str != null && str.length() > 0 &&
         IntStream.range(0, str.length()).allMatch(i -> i == 0 && (str.charAt(i) == '-' || str.charAt(i) == '+')
                  || Character.isDigit(str.charAt(i)));
}

Тестовый код:

public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    Arrays.asList("1231231", "-1232312312", "+12313123131", "qwqe123123211", "2", "0000000001111", "", "123-", "++123",
            "123-23", null, "+-123").forEach(s -> {
        System.out.printf("%15s %s%n", s, isInteger(s));
    });
}

Результаты теста кода:

        1231231 true
    -1232312312 true
   +12313123131 true
  qwqe123123211 false
              2 true
  0000000001111 true
                false
           123- false
          ++123 false
         123-23 false
           null false
          +-123 false
3 голосов
/ 26 октября 2008

Вы также можете использовать класс Scanner и использовать hasNextInt () - и это позволяет вам проверять и другие типы, такие как float и т. Д.

3 голосов
/ 18 марта 2014

Если ваш массив String содержит чистые целые числа и строки, приведенный ниже код должен работать. Вам нужно только взглянуть на первого персонажа. например [ "4", "44", "ABC", "77", "связь"]

if (Character.isDigit(string.charAt(0))) {
    //Do something with int
}
2 голосов
/ 26 октября 2008

Как насчет:

return Pattern.matches("-?\\d+", input);
2 голосов
/ 25 февраля 2014

Вы можете попробовать утилиты apache

NumberUtils.isNumber( myText)

См. Javadoc здесь

2 голосов
/ 26 июля 2013

Вы просто отметили NumberFormatException : -

 String value="123";
 try  
 {  
    int s=Integer.parseInt(any_int_val);
    // do something when integer values comes 
 }  
 catch(NumberFormatException nfe)  
 {  
          // do something when string values comes 
 }  
1 голос
/ 22 апреля 2016

Другой вариант:

private boolean isNumber(String s) {
    boolean isNumber = true;
    for (char c : s.toCharArray()) {
        isNumber = isNumber && Character.isDigit(c);
    }
    return isNumber;
}
1 голос
/ 08 июля 2015

Если вы используете Android API, вы можете использовать:

TextUtils.isDigitsOnly(str);
1 голос
/ 02 мая 2012

Вам, вероятно, также необходимо учесть вариант использования:

Если большую часть времени вы ожидаете, что числа будут действительными, то перехват исключения только приводит к снижению производительности при попытке преобразовать недопустимые числа. Принимая во внимание, что вызов некоторого метода isInteger() и последующее преобразование с использованием Integer.parseInt() будет всегда приведет к снижению производительности для допустимых чисел - строки анализируются дважды, один раз проверкой и один раз преобразованием.

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