Получить int из строки, также содержащей буквы, в Java

Как я могу получить значение int из строки, такой как 423e, т.е. строки, которая содержит число, но также, возможно, и букву?

Integer.parseInt() не работает, так как строка должна быть полностью числом.


person DisgruntledGoat    schedule 26.02.2010    source источник
comment
ничего не зная о java, я знаю, что вы можете сделать это с помощью регулярных выражений. сначала удалите все символы, отличные от 0-9, затем проанализируйте все, что осталось. Это то, что вы ищете?   -  person matt lohkamp    schedule 26.02.2010


Ответы (6)


Если вы не говорите о числах с основанием 16 (для которых есть метод анализа как Hex), вам нужно явно выделить интересующую вас часть, а затем преобразовать ее. В конце концов, какова будет семантика чего-то вроде 23e44e11d в базе 10?

Регулярные выражения могут помочь, если вы точно знаете, что у вас есть только одно число. Java имеет встроенный парсер регулярных выражений.

Если, с другой стороны, ваша цель состоит в том, чтобы объединить все цифры и вывести альфа-каналы, то это довольно просто сделать, итерируя символ за символом для построения строки с помощью StringBuilder, а затем анализируя ее.

person Uri    schedule 26.02.2010
comment
Спасибо, я сделал это с помощью регулярного выражения. Я думал, что где-то может быть встроенный метод. - person DisgruntledGoat; 26.02.2010

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

Integer.parseInt(s.replaceAll("[\\D]", ""))

Это также удалит нецифровые символы между цифрами, поэтому "x1x1x" станет 11.

Если вам нужно подтвердить, что строка состоит из последовательности цифр (по крайней мере, одна), возможно, следующих за буквой, используйте это:

s.matches("[\\d]+[A-Za-z]?")
person polygenelubricants    schedule 26.02.2010

Класс NumberFormat будет анализировать строку только до тех пор, пока она не достигнет неразборчивого символа:

((Number)NumberFormat.getInstance().parse("123e")).intValue()

следовательно, вернет 123.

person jarnbjo    schedule 26.02.2010
comment
Существует также getIntegerInstance() - person mlt; 26.04.2016

Вы также можете использовать сканер:

Scanner s = new Scanner(MyString);
s.nextInt();
person Soheil Setayeshi    schedule 10.04.2013
comment
Класс Scanner предполагает наличие пробела в качестве разделителя. между токенами, но это можно изменить на любое регулярное выражение, как в new Scanner("456e").useDelimiter("\\D").nextInt(). - person Diogo Kollross; 02.03.2015

Просто пройдитесь по строке, создав целое число, как обычно, но игнорируя нечисловые символы:

int res = 0;
for (int i=0; i < str.length(); i++) {
    char c = s.charAt(i);
    if (c < '0' || c > '9') continue;
    res = res * 10 + (c - '0');
}
person Claudiu    schedule 26.02.2010
comment
Почти уверен, что последняя строка должна быть res = res * 10 + c - '0'; - person benkc; 21.08.2013

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

Что-то типа:

    String something = "423e";
    int length = something.length();
    String result = "";
    for (int i = 0; i < length; i++) {
        Character character = something.charAt(i);
        if (Character.isDigit(character)) {
            result += character;
        }
    }
    System.out.println("result is: " + result);
person digiarnie    schedule 26.02.2010
comment
Алгоритм правильный, но вы должны использовать StringBuilder для добавления к результату. - person Steve Kuo; 26.02.2010
comment
Согласовано. Я думаю, что нельзя всегда быть идеальным, когда печатаешь на скорую руку. - person digiarnie; 26.02.2010
comment
Тогда лучше не торопитесь. Конкатенация в цикле — одна из худших вещей, которые вы могли бы сделать со строками. И это до сих пор не исправлено спустя 6 лет. - person Vlasec; 19.08.2016
comment
Если бы только была ссылка edit.... - person takendarkk; 13.03.2017