Определить, является ли String целым числом в Java

Я пытаюсь определить, является ли конкретный элемент в массиве строк целым числом или нет.

Я .split(" ")'ing выражение infix в форме String, а затем попытаюсь разбить результирующий массив на два массива; один для целых чисел, один для операторов, отбрасывающий круглые скобки и другие разные элементы. Какой был бы лучший способ сделать это?

Я думал, что смогу найти метод Integer.isInteger(String arg) или что-то в этом роде, но не удачу.

Ответ 1

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

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

В качестве альтернативы вы можете полагаться на библиотеку Java, чтобы иметь это. Это не исключение, и вы поймете почти все условия ошибки, о которых вы можете думать. Это будет немного дороже (вам нужно создать объект Scanner, который в критически плотной петле вы не хотите делать. Но обычно это не должно быть слишком дорогостоящим, поэтому для повседневной работы операции должны быть довольно надежными.

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

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

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}

Ответ 2

Лучше использовать регулярное выражение.

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


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

Нельзя использовать NumberFormatException здесь, если вы можете использовать if-statement вместо этого.

Ответ 3

Или вы можете получить небольшую помощь от наших хороших друзей в Apache Commons: StringUtils.isNumeric(String str)

Ответ 4

Или просто

mystring.matches("\\d+")

хотя он вернет true для чисел, больших, чем int

Ответ 5

Вы хотите использовать метод Integer.parseInt(String).

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}

Ответ 6

Как альтернатива попыткам синтаксического анализа строки и перехвата NumberFormatException, вы можете использовать регулярное выражение; например.

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

Скорее всего, это будет быстрее, особенно если вы предварительно скомпилируете и повторно используете регулярное выражение. Однако catch состоит в том, что Integer.parseInt(str) по-прежнему будет терпеть неудачу, если str представляет число, находящееся за пределами диапазона юридических значений int.

Ответ 7

Вы можете использовать Integer.parseInt(str) и поймать NumberFormatException, если строка не является допустимым целым числом, следующим образом (как указано всеми ответами):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

Однако обратите внимание, что если вычисляемое целочисленное число переполняется, будет отправлено одно и то же исключение. Ваша цель состояла в том, чтобы выяснить, действительно ли это целое число. Поэтому его безопаснее сделать свой собственный метод для проверки действительности:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}

Ответ 8

Вы можете использовать Integer.parseInt() или Integer.valueOf(), чтобы получить целое число из строки, и поймать исключение, если оно не является синтаксическим значением int. Вы хотите быть уверены, что поймаете NumberFormatException, который он может выбросить.

Может быть полезно отметить, что valueOf() вернет объект Integer, а не примитивный int.

Ответ 9

public boolean isInt(String str){
    return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.replace("-", "").matches(
            "[0-9]+") : str.matches("[0-9]+");
}