Как мне преобразовать строку в int в Java? - PullRequest
2805 голосов
/ 07 апреля 2011

Как я могу преобразовать String в int в Java?

Моя строка содержит только числа, и я хочу вернуть число, которое она представляет.

Например,учитывая строку "1234", результатом должно быть число 1234.

Ответы [ 43 ]

3868 голосов
/ 07 апреля 2011
String myString = "1234";
int foo = Integer.parseInt(myString);

Если вы посмотрите на Java-документацию , вы заметите «уловку» в том, что эта функция может выдавать NumberFormatException, что, конечно, вы должны обработать:

int foo;
try {
   foo = Integer.parseInt(myString);
}
catch (NumberFormatException e)
{
   foo = 0;
}

(По умолчанию для этого искаженного числа установлено значение 0, но вы можете сделать что-нибудь еще, если хотите.)

Кроме того, вы можете использовать метод Ints из библиотеки Guava, который в сочетании с Optional в Java 8 обеспечивает мощный и лаконичный способ преобразования строки в int:

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)
641 голосов
/ 07 апреля 2011

Например, есть два способа:

Integer x = Integer.valueOf(str);
// or
int y = Integer.parseInt(str);

Существует небольшая разница между этими методами:

  • valueOf возвращает новый или кэшированный экземпляр java.lang.Integer
  • parseInt возвращает примитив int.

То же самое для всех случаев: Short.valueOf / parseShort, Long.valueOf / parseLong и т. Д.

233 голосов
/ 30 апреля 2013

Хорошо, очень важный момент, который следует учитывать, - это то, что анализатор целых чисел генерирует исключение NumberFormatException, как указано в Javadoc .

int foo;
String StringThatCouldBeANumberOrNot = "26263Hello"; //will throw exception
String StringThatCouldBeANumberOrNot2 = "26263"; //will not throw exception
try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot);
} catch (NumberFormatException e) {
      //Will Throw exception!
      //do something! anything to handle the exception.
}

try {
      foo = Integer.parseInt(StringThatCouldBeANumberOrNot2);
} catch (NumberFormatException e) {
      //No problem this time, but still it is good practice to care about exceptions.
      //Never trust user input :)
      //Do something! Anything to handle the exception.
}

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

80 голосов
/ 11 сентября 2013

Делать это вручную:

public static int strToInt( String str ){
    int i = 0;
    int num = 0;
    boolean isNeg = false;

    //Check for negative sign; if it's there, set the isNeg flag
    if (str.charAt(0) == '-') {
        isNeg = true;
        i = 1;
    }

    //Process each character of the string;
    while( i < str.length()) {
        num *= 10;
        num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
    }

    if (isNeg)
        num = -num;
    return num;
}
43 голосов
/ 27 августа 2015

Альтернативным решением является использование Apache Commons ' NumberUtils:

int num = NumberUtils.toInt("1234");

Утилита Apache удобна тем, что, если строка имеет недопустимый формат числа, всегда возвращается 0.Таким образом, вы сэкономите блок try catch.

Apache NumberUtils API версии 3.4

42 голосов
/ 21 марта 2014

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

Первое, что нужно сделать, - это получить ввод, в данном случае, строку цифр;Я назову это String number, и в этом случае я приведу пример с использованием числа 12, поэтому String number = "12";

Еще одним ограничением было то, что я не мог использовать повторяющиеся циклы, поэтомуцикл for (который был бы идеален) также нельзя использовать.Это немного ограничивает нас, но опять же, это цель.Поскольку мне потребовались только две цифры (последние две цифры), простое решение charAt решило это:

 // Obtaining the integer values of the char 1 and 2 in ASCII
 int semilastdigitASCII = number.charAt(number.length()-2);
 int lastdigitASCII = number.charAt(number.length()-1);

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

 double semilastdigit = semilastdigitASCII - 48;  //A quick look, and -48 is the key
 double lastdigit = lastdigitASCII - 48;

Теперь, почему двойной?Ну, из-за действительно "странного" шага.В настоящее время у нас есть два двойных, 1 и 2, но нам нужно превратить его в 12, мы не можем выполнить математическую операцию.

Мы делим последнее (lastdigit) на 10 вмода 2/10 = 0.2 (отсюда и почему двойная) вот так:

 lastdigit = lastdigit/10;

Это просто игра с числами.Мы превращали последнюю цифру в десятичную.Но теперь посмотрим, что происходит:

 double jointdigits = semilastdigit + lastdigit; // 1.0 + 0.2 = 1.2

Не вдаваясь в математику, мы просто выделяем единицы из цифр числа.Видите ли, поскольку мы учитываем только 0-9, деление на кратное 10 похоже на создание «ящика», в котором вы храните его (вспомните, когда учитель первого класса объяснил вам, что такое единица и сотня).Итак:

 int finalnumber = (int) (jointdigits*10); // Be sure to use parentheses "()"

И вот, пожалуйста.Вы превратили строку цифр (в данном случае две цифры) в целое число, состоящее из этих двух цифр, учитывая следующие ограничения:

  • Нет повторяющихся циклов
  • Нет "Магия"Такие выражения, как parseInt
33 голосов
/ 07 марта 2016

Integer.decode

Вы также можете использовать public static Integer decode(String nm) throws NumberFormatException.

Это также работает для базовых 8 и 16:

// base 10
Integer.parseInt("12");     // 12 - int
Integer.valueOf("12");      // 12 - Integer
Integer.decode("12");       // 12 - Integer
// base 8
// 10 (0,1,...,7,10,11,12)
Integer.parseInt("12", 8);  // 10 - int
Integer.valueOf("12", 8);   // 10 - Integer
Integer.decode("012");      // 10 - Integer
// base 16
// 18 (0,1,...,F,10,11,12)
Integer.parseInt("12",16);  // 18 - int
Integer.valueOf("12",16);   // 18 - Integer
Integer.decode("#12");      // 18 - Integer
Integer.decode("0x12");     // 18 - Integer
Integer.decode("0X12");     // 18 - Integer
// base 2
Integer.parseInt("11",2);   // 3 - int
Integer.valueOf("11",2);    // 3 - Integer

Если вы хотите получить int вместо Integer, вы можете использовать:

  1. распаковка:

    int val = Integer.decode("12"); 
    
  2. intValue()

    Integer.decode("12").intValue();
    
26 голосов
/ 04 апреля 2016

Всякий раз, когда есть малейшая вероятность того, что данная строка не содержит целое число, вы должны обработать этот особый случай. К сожалению, стандартные методы Java Integer::parseInt и Integer::valueOf выдают NumberFormatException, чтобы сигнализировать об этом особом случае. Таким образом, вы должны использовать исключения для управления потоком, который обычно считается плохим стилем кодирования.

По моему мнению, этот особый случай должен быть обработан путем возврата Optional<Integer>. Поскольку Java не предлагает такой метод, я использую следующую оболочку:

private Optional<Integer> tryParseInteger(String string) {
    try {
        return Optional.of(Integer.valueOf(string));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

Использование:

// prints 1234
System.out.println(tryParseInteger("1234").orElse(-1));
// prints -1
System.out.println(tryParseInteger("foobar").orElse(-1));

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

23 голосов
/ 20 октября 2013

Преобразование строки в int сложнее, чем просто преобразование числа.Вы думаете о следующих проблемах:

  • Содержит ли строка только цифры 0-9 ?
  • Что случилось с - / + до или после строки?Это возможно (имеется в виду учетные номера)?
  • Что случилось с MAX _- / MIN_INFINITY? Что произойдет, если строка будет 99999999999999999999?Может ли машина обрабатывать эту строку как int?
23 голосов
/ 03 октября 2017

Методы для этого:

 1. Integer.parseInt(s)
 2. Integer.parseInt(s, radix)
 3. Integer.parseInt(s, beginIndex, endIndex, radix)
 4. Integer.parseUnsignedInt(s)
 5. Integer.parseUnsignedInt(s, radix)
 6. Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
 7. Integer.valueOf(s)
 8. Integer.valueOf(s, radix)
 9. Integer.decode(s)
 10. NumberUtils.toInt(s)
 11. NumberUtils.toInt(s, defaultValue)

Integer.valueOf создает объект Integer, все остальные методы - примитив int.

Последние 2 метода из commons-lang3 и большая статья о конвертации здесь .

...