Что состоит в том, чтобы проверить лучший способ, представляет ли Строка целое число в Java?

202
задан user1803551 27 October 2017 в 20:35
поделиться

14 ответов

Если Вы не будете обеспокоены потенциальными проблемами переполнения, то эта функция будет работать приблизительно в 20-30 раз быстрее, чем использование Integer.parseInt().

public static boolean isInteger(String str) {
    if (str == null) {
        return false;
    }
    int length = str.length();
    if (length == 0) {
        return false;
    }
    int i = 0;
    if (str.charAt(0) == '-') {
        if (length == 1) {
            return false;
        }
        i = 1;
    }
    for (; i < length; i++) {
        char c = str.charAt(i);
        if (c < '0' || c > '9') {
            return false;
        }
    }
    return true;
}
160
ответ дан Jonas Klemming 23 November 2019 в 05:00
поделиться
is_number = true;
try {
  Integer.parseInt(mystr)
} catch (NumberFormatException  e) {
  is_number = false;
}
0
ответ дан Ricardo Acras 23 November 2019 в 05:00
поделиться

Что Вы сделали работы, но Вы, вероятно, не должны всегда проверять тот путь. Выдавание исключения должно быть зарезервировано для "исключительных" ситуаций (возможно, который помещается в Ваш случай, хотя), и являются очень дорогостоящими с точки зрения производительности.

0
ответ дан lucas 23 November 2019 в 05:00
поделиться
Number number;
try {
    number = NumberFormat.getInstance().parse("123");
} catch (ParseException e) {
    //not a number - do recovery.
    e.printStackTrace();
}
//use number
0
ответ дан Ran Biron 23 November 2019 в 05:00
поделиться

Сделал быстрый сравнительный тест. Исключения не на самом деле, что expensivve, если Вы не начинаете выталкивать назад несколько методов и JVM, должен сделать большую работу для получения стека выполнения на месте. При пребывании в том же методе они не плохие исполнители.

 public void RunTests()
 {
     String str = "1234567890";

     long startTime = System.currentTimeMillis();
     for(int i = 0; i < 100000; i++)
         IsInt_ByException(str);
     long endTime = System.currentTimeMillis();
     System.out.print("ByException: ");
     System.out.println(endTime - startTime);

     startTime = System.currentTimeMillis();
     for(int i = 0; i < 100000; i++)
         IsInt_ByRegex(str);
     endTime = System.currentTimeMillis();
     System.out.print("ByRegex: ");
     System.out.println(endTime - startTime);

     startTime = System.currentTimeMillis();
     for(int i = 0; i < 100000; i++)
         IsInt_ByJonas(str);
     endTime = System.currentTimeMillis();
     System.out.print("ByJonas: ");
     System.out.println(endTime - startTime);
 }

 private boolean IsInt_ByException(String str)
 {
     try
     {
         Integer.parseInt(str);
         return true;
     }
     catch(NumberFormatException nfe)
     {
         return false;
     }
 }

 private boolean IsInt_ByRegex(String str)
 {
     return str.matches("^-?\\d+$");
 }

 public boolean IsInt_ByJonas(String str)
 {
     if (str == null) {
             return false;
     }
     int length = str.length();
     if (length == 0) {
             return false;
     }
     int i = 0;
     if (str.charAt(0) == '-') {
             if (length == 1) {
                     return false;
             }
             i = 1;
     }
     for (; i < length; i++) {
             char c = str.charAt(i);
             if (c <= '/' || c >= ':') {
                     return false;
             }
     }
     return true;
 }

Вывод:

ByException: 31

ByRegex: 453 (примечание: перекомпиляция шаблона каждый раз)

ByJonas: 16

я действительно соглашаюсь, что решение K Jonas является самым устойчивым также. Похож он побеждает:)

36
ответ дан LarsH 23 November 2019 в 05:00
поделиться
org.apache.commons.lang.StringUtils.isNumeric 

, хотя стандартный lib Java действительно пропускает такие служебные функции

, я думаю, что Apache, который палата общин, "должен иметь" для каждого программиста Java

слишком плохой, это еще не портировано к Java5

32
ответ дан Łukasz Bownik 23 November 2019 в 05:00
поделиться

Это частично зависит от того, под чем Вы подразумеваете, "может быть преобразован в целое число".

, Если Вы имеете в виду, "может быть преобразован в интервал в Java" тогда, ответ от Jonas является хорошим началом, но не вполне заканчивает задание. Это передало бы 999999999999999999999999999999, например. Я добавил бы нормальный вызов попытки/выгоды от Вашего собственного вопроса в конце метода.

познаковые проверки эффективно отклонят "не целое число во всех" случаях, уезжая, "это - целое число, но Java не может обработать его" случаи, которые будут пойманы более медленным маршрутом исключения. Вы могли вносить свою лепту вручную также, но это было бы партия более сложно.

22
ответ дан Jon Skeet 23 November 2019 в 05:00
поделиться

Всего один комментарий о regexp. Каждый пример, обеспеченный здесь, является неправильным!. Если Вы хотите использовать regexp, не забывают, что компиляция шаблона занимает много времени. Это:

str.matches("^-?\\d+$")

и также это:

Pattern.matches("-?\\d+", input);

компиляция причин шаблона в каждом вызове метода. К используемому это правильно следует:

import java.util.regex.Pattern;

/**
 * @author Rastislav Komara
 */
public class NaturalNumberChecker {
    public static final Pattern PATTERN = Pattern.compile("^\\d+$");

    boolean isNaturalNumber(CharSequence input) {
        return input != null && PATTERN.matcher(input).matches();
    }
}
16
ответ дан rtruszk 23 November 2019 в 05:00
поделиться

Я скопировал код с ответа rally25rs и добавил некоторые тесты для данных нецелого числа. Результаты бесспорно выступают за метод, отправленный Jonas Klemming. Результаты для метода Исключения, который я первоначально отправил, довольно хороши, когда у Вас есть целочисленные данные, но они хуже, когда Вы не делаете, в то время как результаты для решения RegEx (что я поставлю много людей использование) были последовательно плохо. См. ответ Felipe для скомпилированного regex примера, который намного быстрее.

public void runTests()
{
    String big_int = "1234567890";
    String non_int = "1234XY7890";

    long startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByException(big_int);
    long endTime = System.currentTimeMillis();
    System.out.print("ByException - integer data: ");
    System.out.println(endTime - startTime);

    startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByException(non_int);
    endTime = System.currentTimeMillis();
    System.out.print("ByException - non-integer data: ");
    System.out.println(endTime - startTime);

    startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByRegex(big_int);
    endTime = System.currentTimeMillis();
    System.out.print("\nByRegex - integer data: ");
    System.out.println(endTime - startTime);

    startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByRegex(non_int);
    endTime = System.currentTimeMillis();
    System.out.print("ByRegex - non-integer data: ");
    System.out.println(endTime - startTime);

    startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByJonas(big_int);
    endTime = System.currentTimeMillis();
    System.out.print("\nByJonas - integer data: ");
    System.out.println(endTime - startTime);

    startTime = System.currentTimeMillis();
    for(int i = 0; i < 100000; i++)
        IsInt_ByJonas(non_int);
    endTime = System.currentTimeMillis();
    System.out.print("ByJonas - non-integer data: ");
    System.out.println(endTime - startTime);
}

private boolean IsInt_ByException(String str)
{
    try
    {
        Integer.parseInt(str);
        return true;
    }
    catch(NumberFormatException nfe)
    {
        return false;
    }
}

private boolean IsInt_ByRegex(String str)
{
    return str.matches("^-?\\d+$");
}

public boolean IsInt_ByJonas(String str)
{
    if (str == null) {
            return false;
    }
    int length = str.length();
    if (length == 0) {
            return false;
    }
    int i = 0;
    if (str.charAt(0) == '-') {
            if (length == 1) {
                    return false;
            }
            i = 1;
    }
    for (; i < length; i++) {
            char c = str.charAt(i);
            if (c <= '/' || c >= ':') {
                    return false;
            }
    }
    return true;
}

Результаты:

ByException - integer data: 47
ByException - non-integer data: 547

ByRegex - integer data: 390
ByRegex - non-integer data: 313

ByJonas - integer data: 0
ByJonas - non-integer data: 16
12
ответ дан Community 23 November 2019 в 05:00
поделиться

Это короче, но короче не обязательно лучше (и это не поймает целочисленные значения, которые являются вне диапазона, , как указано в комментарии danatel):

input.matches("^-?\\d+$");

Лично, так как реализацией запасаются во вспомогательном методе, и правильность превосходит длину, я просто пошел бы с чем-то как то, что Вы имеете (минус ловля основы Exception класс, а не NumberFormatException).

6
ответ дан Community 23 November 2019 в 05:00
поделиться

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

3
ответ дан Derek Mahar 23 November 2019 в 05:00
поделиться

Как насчет:

return Pattern.matches("-?\\d+", input);
2
ответ дан Kristian 23 November 2019 в 05:00
поделиться

У Вас есть он, но необходимо только поймать NumberFormatException.

60
ответ дан Subhrajyoti Majumder 23 November 2019 в 05:00
поделиться
Integer.valueOf(string); 

работы для меня большую часть времени!

-3
ответ дан JSK NS 23 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: