Как мне преобразовать строку в int в Java?

2720

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

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

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

Теги:
string
type-conversion
int

44 ответа

3767
Лучший ответ
String myString = "1234";
int foo = Integer.parseInt(myString);

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

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

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

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

import com.google.common.primitives.Ints;

int foo = Optional.ofNullable(myString)
 .map(Ints::tryParse)
 .orElse(0)
  • 143
    Это вызовет NumberFormatException если input не является допустимым числом.
  • 13
    В дополнение к перехвату NumberFormatException, пользователь должен также быть осторожным с длиной строк, которые они передают; если они достаточно длинные, чтобы переполнить целое число, они могут вместо этого рассмотреть возможность использования Long :: parseLong.
Показать ещё 4 комментария
628

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

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

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

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

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

  • 73
    Различия между этими двумя методами см. В этом вопросе.
  • 18
    Метод valueOf просто return valueOf(parseInt(string));
Показать ещё 2 комментария
230

Ну, очень важный момент для рассмотрения состоит в том, что парсер Integer генерирует 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.
}

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

  • 0
    как я могу разобрать "26263 Здравствуйте"? Я хочу извлечь 26263 в этом случае
  • 1
    @ user463035818 - См. docs.oracle.com/javase/8/docs/api/java/util/regex/… - шаблон регулярного выражения "([0-9]+)" "захватит" первую последовательность одного или больше цифр от одного до девяти. Посмотрите на класс Matcher в этом пакете.
83

Сделайте это вручную:

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

    //Check for negative sign; if it 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;
}
  • 18
    Что делать, если входное значение больше 2 ^ 32? Что если ввод содержит нечисловые символы?
  • 77
    Одна из вещей, которую программист должен выучить при присоединении к рабочей силе, если не раньше, - это никогда не изобретать колеса. Это может быть забавное упражнение, но не ожидайте, что ваш код пройдет проверку кода, если вы делаете это в коммерческих условиях.
Показать ещё 3 комментария
40

В настоящее время я выполняю задание для колледжа, где я не могу использовать определенные выражения, такие как приведенные выше, и, посмотрев таблицу 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 (следовательно, поэтому double) следующим образом:

 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 "()"

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

  • Нет повторяющихся циклов
  • Нет выражений "Magic", таких как parseInt
  • 6
    Использование типа double для анализа целого числа не только плохая идея с точки зрения производительности. Значения типа 0.2 являются периодическими числами в представлении с плавающей точкой и не могут быть точно представлены. Попробуйте System.out.println (0,1 + 0,2), чтобы увидеть смысл - результат не будет 0,3! Лучше придерживаться кода библиотеки везде, где вы можете, в этом случае Integer.parseInt ().
  • 9
    Непонятно, какую проблему пытается решить этот ответ, во-первых, почему у кого-либо должно быть то ограничение, которое вы описываете, во-вторых, почему вы должны смотреть на таблицу ASCII, поскольку вы можете просто использовать '0' для символа вместо 48 и никогда не придется беспокоиться о его фактическом числовом значении. В-третьих, весь обход с double значениями не имеет никакого смысла, так как вы делите на десять, просто умножить на десять потом. Результат просто semilastdigit * 10 + lastdigit как изученный в начальной школе, когда была введена десятичная система…
Показать ещё 1 комментарий
38

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

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

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

Apache NumberUtils API версии 3.4

  • 24
    Вы редко хотите, чтобы 0 использовался при анализе неверного числа.
  • 4
    Ноль - это то, что Java использует по умолчанию, если поле int для объекта не установлено. Так что в этом отношении это имеет смысл.
Показать ещё 1 комментарий
31

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, вы можете использовать:

  • Распаковка:

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

    Integer.decode("12").intValue();
    
  • 0
    В заключение! Кто-то, кто на самом деле потрудился опубликовать результаты / вывод конверсий! Можете ли вы добавить некоторые со знаком "-"?
26

Всякий раз, когда имеется малейшая вероятность того, что данная строка не содержит целочисленного значения, вам придется обрабатывать этот частный случай. К сожалению, стандартные Java-методы Integer::parseInt и Integer::valueOf бросают a 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));

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

22

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

  • Строка содержит только цифры 0-9?
  • Что происходит с -/+ до или после строки? Возможно ли это (ссылаясь на учетные номера)?
  • Что происходит с MAX _-/MIN_INFINITY? Что произойдет, если строка 99999999999999999999? Может ли машина обрабатывать эту строку как int?
  • 1
    Да - и есть неприятный крайний случай около -2 ^ 31. Если вы попытаетесь отрицать 2 ^ 31, вы можете столкнуться с трудностями ......
21

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

 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 и большая статья о конвертации здесь.

21

Мы можем использовать метод parseInt(String str) класса оболочки Integer для преобразования значения String в целочисленное значение.

Например:

String strValue = "12345";
Integer intValue = Integer.parseInt(strVal);

Класс Integer также предоставляет метод valueOf(String str):

String strValue = "12345";
Integer intValue = Integer.valueOf(strValue);

Мы также можем использовать toInt(String strValue) класс утилиты NumberUtils для преобразования:

String strValue = "12345";
Integer intValue = NumberUtils.toInt(strValue);
19

Используйте Integer.parseInt(yourString)

Помните следующие вещи:

Integer.parseInt("1"); //ОК

Integer.parseInt("-1"); //ОК

Integer.parseInt("+1"); //ОК

Integer.parseInt(" 1"); //Исключение (пустое пространство)

Integer.parseInt("2147483648"); //Исключение (целое число ограничено максимальным значением 2 147 483 647)

Integer.parseInt("1.1"); //Исключение (. Или, или все, что не разрешено)

Integer.parseInt(""); // Исключение (не 0 или что-то)

Существует только один тип исключения: NumberFormatException

  • 0
    Максимальное значение int здесь также дает NumberFormatException?
  • 0
    Нет, максимальное значение все еще хорошо
19

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

static public Integer str2Int(String str) {
    Integer result = null;
    if (null == str || 0 == str.length()) {
        return null;
    }
    try {
        result = Integer.parseInt(str);
    } 
    catch (NumberFormatException e) {
        String negativeMode = "";
        if(str.indexOf('-') != -1)
            negativeMode = "-";
        str = str.replaceAll("-", "" );
        if (str.indexOf('.') != -1) {
            str = str.substring(0, str.indexOf('.'));
            if (str.length() == 0) {
                return (Integer)0;
            }
        }
        String strNum = str.replaceAll("[^\\d]", "" );
        if (0 == strNum.length()) {
            return null;
        }
        result = Integer.parseInt(negativeMode + strNum);
    }
    return result;
}

Тестирование с помощью JUnit:

@Test
public void testStr2Int() {
    assertEquals("is numeric", (Integer)(-5), Helper.str2Int("-5"));
    assertEquals("is numeric", (Integer)50, Helper.str2Int("50.00"));
    assertEquals("is numeric", (Integer)20, Helper.str2Int("$ 20.90"));
    assertEquals("is numeric", (Integer)5, Helper.str2Int(" 5.321"));
    assertEquals("is numeric", (Integer)1000, Helper.str2Int("1,000.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("0.50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int(".50"));
    assertEquals("is numeric", (Integer)0, Helper.str2Int("-.10"));
    assertEquals("is numeric", (Integer)Integer.MAX_VALUE, Helper.str2Int(""+Integer.MAX_VALUE));
    assertEquals("is numeric", (Integer)Integer.MIN_VALUE, Helper.str2Int(""+Integer.MIN_VALUE));
    assertEquals("Not
     is numeric", null, Helper.str2Int("czv.,xcvsa"));
    /**
     * Dynamic test
     */
    for(Integer num = 0; num < 1000; num++) {
        for(int spaces = 1; spaces < 6; spaces++) {
            String numStr = String.format("%0"+spaces+"d", num);
            Integer numNeg = num * -1;
            assertEquals(numStr + ": is numeric", num, Helper.str2Int(numStr));
            assertEquals(numNeg + ": is numeric", numNeg, Helper.str2Int("- " + numStr));
        }
    }
}
  • 0
    Вы можете сделать это проще: (int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
17

Просто для удовольствия: вы можете использовать Java 8 Optional для преобразования String в Integer:

String str = "123";
Integer value = Optional.of(str).map(Integer::valueOf).get();
// Will return the integer value of the specified string, or it
// will throw an NPE when str is null.

value = Optional.ofNullable(str).map(Integer::valueOf).orElse(-1);
// Will do the same as the code above, except it will return -1
// when srt is null, instead of throwing an NPE.

Здесь мы просто объединяем Integer.valueOf и Optinal. Вероятно, могут быть ситуации, когда это полезно - например, если вы хотите избежать нулевых проверок. Код Pre Java 8 будет выглядеть так:

Integer value = (str == null) ? -1 : Integer.parseInt(str);
  • 7
    Если вы спросите меня, он выдаст NFE, если вы поставите недопустимую строку Integer ...
  • 1
    @KarelG Да, это так. Этот код выше бесполезен.
Показать ещё 1 комментарий
16

Guava имеет tryParse (String), который возвращает null, если строка не может быть проанализирована, например:

Integer fooInt = Ints.tryParse(fooString);
if (fooInt != null) {
  ...
}
14

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

string mystr = mystr.replaceAll( "[^\\d]", "" );
int number= Integer.parseInt(mystr);

Но будьте предупреждены, что это работает только для неотрицательных чисел.

  • 15
    Это приведет к тому, что -42 будет проанализировано как 42 .
  • 8
    Да, это работает только для неотрицательных чисел, которые правильны для начала и, следовательно, не нуждаются в этом шаге замены. В любом другом случае эта попытка автоматически исправить это усугубит ситуацию (как почти каждая попытка автоматически исправить что-то). Если я передам "4+2" , я получу 42 в результате без всякого намека на то, что то, что я пытался сделать, было неверным. У пользователя будет впечатление, что ввод основных выражений, таких как 4+2 был допустимым, но приложение продолжает работать с неверным значением. Кроме того, тип String , а не string
Показать ещё 2 комментария
12

Помимо этих выше ответов, я хотел бы добавить несколько функций:

    public static int parseIntOrDefault(String value, int defaultValue) {
    int result = defaultValue;
    try {
      result = Integer.parseInt(value);
    } catch (Exception e) {

    }
    return result;
  }

  public static int parseIntOrDefault(String value, int beginIndex, int defaultValue) {
    int result = defaultValue;
    try {
      String stringValue = value.substring(beginIndex);
      result = Integer.parseInt(stringValue);
    } catch (Exception e) {

    }
    return result;
  }

  public static int parseIntOrDefault(String value, int beginIndex, int endIndex, int defaultValue) {
    int result = defaultValue;
    try {
      String stringValue = value.substring(beginIndex, endIndex);
      result = Integer.parseInt(stringValue);
    } catch (Exception e) {

    }
    return result;
  }

И вот результаты при их запуске:

  public static void main(String[] args) {
    System.out.println(parseIntOrDefault("123", 0)); // 123
    System.out.println(parseIntOrDefault("aaa", 0)); // 0
    System.out.println(parseIntOrDefault("aaa456", 3, 0)); // 456
    System.out.println(parseIntOrDefault("aaa789bbb", 3, 6, 0)); // 789
  }
9

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

  • Для действительного натурального числа:

    private static int parseInt(String str) {
        int i, n = 0;
    
        for (i = 0; i < str.length(); i++) {
            n *= 10;
            n += str.charAt(i) - 48;
        }
        return n;
    }
    
  • Для положительных и отрицательных целых чисел:

    private static int parseInt(String str) {
        int i=0, n=0, sign=1;
        if(str.charAt(0) == '-') {
            i=1;
            sign=-1;
        }
        for(; i<str.length(); i++) {
            n*=10;
            n+=str.charAt(i)-48;
        }
        return sign*n;
    }
    

  • Если вы ожидаете пробела до или после этих чисел, то перед дальнейшей обработкой обязательно выполните str = str.trim().

9

Вы можете использовать new Scanner("1244").nextInt(). Или спросите, существует ли даже int: new Scanner("1244").hasNextInt()

9

Как уже упоминалось, Apache Commons NumberUtils может это сделать. Какой return 0, если он не может преобразовать строку в int.

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

NumberUtils.toInt(String str, int defaultValue)

Пример:

NumberUtils.toInt("3244", 1) = 3244
NumberUtils.toInt("", 1)     = 1
NumberUtils.toInt(null, 5)   = 5
NumberUtils.toInt("Hi", 6)   = 6
NumberUtils.toInt(" 32 ", 1) = 1 //space in numbers are not allowed
NumberUtils.toInt(StringUtils.trimToEmpty( "  32 ",1)) = 32; 
9

Вы также можете использовать этот код с некоторыми предосторожностями.

  • Вариант № 1: обрабатывать исключение явно, например, показывать диалог сообщения и останавливать выполнение текущего рабочего процесса. Например:

    try
        {
            String stringValue = "1234";
    
            // From String to Integer
            int integerValue = Integer.valueOf(stringValue);
    
            // Or
            int integerValue = Integer.ParseInt(stringValue);
    
            // Now from integer to back into string
            stringValue = String.valueOf(integerValue);
        }
    catch (NumberFormatException ex) {
        //JOptionPane.showMessageDialog(frame, "Invalid input string!");
        System.out.println("Invalid input string!");
        return;
    }
    
  • Вариант № 2: Reset затронутая переменная, если поток выполнения может продолжаться в случае исключения. Например, с некоторыми изменениями в блоке catch

    catch (NumberFormatException ex) {
        integerValue = 0;
    }
    

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

  • 4
    Помещение JOptionPane.showMessageDialog() в ответ на ванильный вопрос Java не имеет смысла.
  • 1
    Integer.valueOf(String); не возвращает тип int .
7

Просто вы можете попробовать следующее:

  • Используйте Integer.parseInt(your_string); для преобразования String в int
  • Используйте Double.parseDouble(your_string); для преобразования String в double

пример

String str = "8955";
int q = Integer.parseInt(str);
System.out.println("Output>>> " + q); // Output: 8955

String str = "89.55";
double q = Double.parseDouble(str);
System.out.println("Output>>> " + q); // Output: 89.55
  • 0
    Этот ответ, кажется, не добавляет ничего кроме ответов, рекомендующих Integer.parseInt, опубликованный несколькими годами ранее (преобразование String в double было бы другим вопросом ).
7

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

int number = Integer.parseInt("1234");

Для String builder и String буфера вы можете использовать:

Integer.parseInt(myBuilderOrBuffer.toString());
7
int foo=Integer.parseInt("1234");

Убедитесь, что в строке нет нечисловых данных.

  • 3
    Это точно так же, как выбор ответа.
  • 3
    Нет смысла в том, чтобы повторять ответ, который кто-то опубликовал перед вами ПЯТЬ ЛЕТ.
6

Я немного удивлен тем, что никто не упоминал конструктор Integer, который берет String в качестве параметра.
Итак, вот:

String myString = "1234";
int i1 = new Integer(myString);

Java 8 - Целое число (String).

Конечно, конструктор вернет тип Integer, а операция unboxing преобразует значение в int.


Важно отметить
Этот конструктор вызывает метод parseInt.

public Integer(String var1) throws NumberFormatException {
    this.value = parseInt(var1, 10);
}
6

Здесь мы идем

String str="1234";
int number = Integer.parseInt(str);
print number;//1234
5

Используйте Integer.parseInt() и поместите его внутри блока try...catch для обработки любых ошибок на всякий случай, если вводится нечисловой символ, например,

private void ConvertToInt(){
    String string = txtString.getText();
    try{
        int integerValue=Integer.parseInt(string);
        System.out.println(integerValue);
    }
    catch(Exception e){
       JOptionPane.showMessageDialog(
         "Error converting string to integer\n" + e.toString,
         "Error",
         JOptionPane.ERROR_MESSAGE);
    }
 }
5

Один из методов: parseInt (String) возвращает примитив int

String number = "10";
int result = Integer.parseInt(number);
System.out.println(result);

Второй метод: valueOf (String) возвращает новый объект Integer().

String number = "10";
Integer result = Integer.valueOf(number);
System.out.println(result);
4

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

import java.util.Scanner;


    public class StringToInt {
     public static void main(String args[]) {
      String inputString;
      Scanner s = new Scanner(System.in);
      inputString = s.nextLine();

      if (!inputString.matches("([+-]?([0-9]*[.])?[0-9]+)")) {
       System.out.println("Not a Number");
      } else {
       Double result2 = getNumber(inputString);
       System.out.println("result = " + result2);
      }

     }
     public static Double getNumber(String number) {
      Double result = 0.0;
      Double beforeDecimal = 0.0;
      Double afterDecimal = 0.0;
      Double afterDecimalCount = 0.0;
      int signBit = 1;
      boolean flag = false;

      int count = number.length();
      if (number.charAt(0) == '-') {
       signBit = -1;
       flag = true;
      } else if (number.charAt(0) == '+') {
       flag = true;
      }
      for (int i = 0; i < count; i++) {
       if (flag && i == 0) {
        continue;

       }
       if (afterDecimalCount == 0.0) {
        if (number.charAt(i) - '.' == 0) {
         afterDecimalCount++;
        } else {
         beforeDecimal = beforeDecimal * 10 + (number.charAt(i) - '0');
        }

       } else {
        afterDecimal = afterDecimal * 10 + number.charAt(i) - ('0');
        afterDecimalCount = afterDecimalCount * 10;
       }
      }
      if (afterDecimalCount != 0.0) {
       afterDecimal = afterDecimal / afterDecimalCount;
       result = beforeDecimal + afterDecimal;
      } else {
       result = beforeDecimal;
      }

      return result * signBit;
     }
    }
  • 1
    Нет необходимости изобретать велосипед, просто используйте Integer.parseInt .
  • 0
    @TobiasWeimer да, мы можем сделать, но это без использования библиотеки
Показать ещё 3 комментария
3

Integer.parseInt(myString); - используя класс-оболочку

3

Можно выполнить 5 способов:

import com.google.common.primitives.Ints;
import org.apache.commons.lang.math.NumberUtils;

1) Использование Ints.tryParse:

String number = "999";
int result = Ints.tryParse(number);

2) Использование NumberUtils.createInteger:

String number = "999";
Integer result = NumberUtils.createInteger(number);

3) Использование NumberUtils.toInt:

String number = "999";
int result = NumberUtils.toInt(number);

4) Использование Integer.valueOf:

String number = "999";
Integer result = Integer.valueOf(number);

5) Использование Integer.parseInt:

String number = "999";
int result = Integer.parseInt(number);
  • 0
    NumberUtils также обрабатывает пустые и пустые сценарии.
3

Кстати, имейте в виду, что если строка равна нулю, вызов:

int i = Integer.parseInt(null);

выдает NumberFormatException, а не исключение NullPointerException.

1

импорт java.util. *;

открытый класс strToint {

    public static void main(String[] args){

            String str = "123";

            byte barr[] = str.getBytes();

            System.out.println(Arrays.toString(barr));
            int result=0;
            for(int i=0;i<barr.length;i++){
                    //System.out.print(barr[i]+" ");
                    int ii = barr[i];
                    char a = (char)ii;
                    int no = Character.getNumericValue(a);
                    result=result*10+no;
                    System.out.println(result);

            }
            System.out.println("result:"+result);
    }

}

1

public static int parseInt (String s) выбрасывает NumberFormatException

вы можете использовать Integer.parseInt() для преобразования строки в int.

преобразовать String 20 в примитив int.

    String n = "20";
    int r = Integer.parseInt(n);//returns a primitive int       
    System.out.println(r);

Выход-20

если строка не содержит целочисленное целое число. он NumberFormatException

String n = "20I";// throwns NumberFormatException
int r = Integer.parseInt(n);
System.out.println(r);

public static Integer valueOf (String s) выбрасывает NumberFormatException

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

String n = "20";
Integer r = Integer.valueOf(n); //returns a new Integer() object.   
System.out.println(r);

Выход-20

Ссылки https://docs.oracle.com/ru/

0

Некоторые из способов конвертировать String в Int:

  1. Integer.parseInt()

Тест строки = "4568"; int new = Integer.parseInt(test);

  1. Integer.valueOf()

Тест строки = "4568"; int new = Integer.parseInt(test);

0

Я написал этот быстрый метод для анализа ввода строки в int или long. Это быстрее, чем текущий JDK 11 Integer.parseInt или Long.parseLong. Хотя вы спрашивали только int, я также включил длинный парсер. Парсер кода ниже требует, чтобы метод парсера был маленьким, чтобы он мог работать быстро. Альтернативная версия находится под тестовым кодом. Альтернативная версия довольно быстрая и не зависит от размера класса.

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

Это только часть класса, где нужны parseInt и parseLong. Обратите внимание, что это касается только базовых 10 чисел.

Тестовый код для синтаксического анализатора int находится ниже кода ниже.

/*
 * Copyright 2019 Khang Hoang Nguyen
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * @author: Khang Hoang Nguyen - [email protected].
 **/
final class faiNumber{        
    private static final long[] longpow = {0L, 1L, 10L, 100L, 1000L, 10000L, 100000L, 1000000L, 10000000L, 100000000L, 1000000000L,
                                           10000000000L, 100000000000L, 1000000000000L, 10000000000000L, 100000000000000L,
                                           1000000000000000L, 10000000000000000L, 100000000000000000L, 1000000000000000000L,
                                           };

    private static final int[] intpow = { 0, 1, 10, 100, 1000, 10000,
                                          100000, 1000000, 10000000, 100000000, 1000000000 
                                        };

    /**
     * parseLong(String str) parse a String into Long. 
     * All errors throw by this method is NumberFormatException.
     * Better errors can be made to tailor to each use case.
     **/
    public static long parseLong(final String str) { 
        final int length = str.length();
        if ( length == 0 ) return 0L;        

        char c1 = str.charAt(0); int start;

        if ( c1 == '-' || c1 == '+' ){
            if ( length == 1 ) throw new NumberFormatException( String.format("Not a valid long value. Input '%s'.", str) );
            start = 1;
        } else {
            start = 0;
        }
        /*
         * Note: if length > 19, possible scenario is to run through the string 
         * to check whether the string contains only valid digits.
         * If the check had only valid digits then a negative sign meant underflow, else, overflow.
         */
        if ( length - start > 19 ) throw new NumberFormatException( String.format("Not a valid long value. Input '%s'.", str) );

        long c; 
        long out = 0L;

        for ( ; start < length; start++){
            c = (str.charAt(start) ^ '0');
            if ( c > 9L ) throw new NumberFormatException( String.format("Not a valid long value. Input '%s'.", str) );
            out += c * longpow[length - start];
        }

        if ( c1 == '-' ){
            out = ~out + 1L;
            // if out > 0 number underflow(supposed to be negative).
            if ( out > 0L ) throw new NumberFormatException( String.format("Not a valid long value. Input '%s'.", str) );
            return out;
        }
        // if out < 0 number overflow(supposed to be positive).
        if ( out < 0L ) throw new NumberFormatException( String.format("Not a valid long value. Input '%s'.", str) );
        return out;
    }

    /**
     * parseInt(String str) parse a string into an int.
     * return 0 if string is empty. 
     **/
    public static int parseInt(final String str) { 
        final int length = str.length();
        if ( length == 0 ) return 0;        

        char c1 = str.charAt(0); int start; 

        if ( c1 == '-' || c1 == '+' ){
            if ( length == 1 ) throw new NumberFormatException( String.format("Not a valid integer value. Input '%s'.", str) );
            start = 1;
        } else {
            start = 0;
        }

        int out = 0; int c;
        int runlen = length - start;

        if ( runlen > 9 ) {
            if ( runlen > 10 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );

            c = (str.charAt(start) ^ '0');   // <- Any number from 0 - 255 ^ 48 will yield greater than 9 except 48 - 57
            if ( c > 9 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
            if ( c > 2 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
            out += c * intpow[length - start++];
        }

        for ( ; start < length; start++){
            c = (str.charAt(start) ^ '0');
            if ( c > 9 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
            out += c * intpow[length - start];
        }

        if ( c1 == '-' ){
            out = ~out + 1;
            if ( out > 0 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
            return out;
        }

        if ( out < 0 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
        return out;
    }
}

Раздел тестового кода. Это должно занять около 200 секунд или около того.

// Int Number Parser Test;
long start = System.currentTimeMillis();    
System.out.println("INT PARSER TEST");
for (int i = Integer.MIN_VALUE; i != Integer.MAX_VALUE; i++){
   if( faiNumber.parseInt(""+i) != i ) System.out.println("Wrong");
   if ( i == 0 ) System.out.println("HalfWay Done");
}

if( faiNumber.parseInt(""+Integer.MAX_VALUE) != Integer.MAX_VALUE ) System.out.println("Wrong");
long end = System.currentTimeMillis();
long result = (end - start);
System.out.println(result);        
// INT PARSER END */

Альтернативный метод, который также очень быстрый. Обратите внимание, что массив int pow не используется, но математическая оптимизация умножается на 10 путем сдвига битов.

public static int parseInt(final String str) { 
    final int length = str.length();
    if ( length == 0 ) return 0;        

    char c1 = str.charAt(0); int start; 

    if ( c1 == '-' || c1 == '+' ){
        if ( length == 1 ) throw new NumberFormatException( String.format("Not a valid integer value. Input '%s'.", str) );
        start = 1;
    } else {
        start = 0;
    }

    int out = 0; int c;
    while( start < length && str.charAt(start) == '0' ) start++; // <-- This to disregard leading 0, can be removed if you know exactly your source does not have leading zeroes.
    int runlen = length - start;

    if ( runlen > 9 ) {
        if ( runlen > 10 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );

        c = (str.charAt(start++) ^ '0');   // <- Any number from 0 - 255 ^ 48 will yield greater than 9 except 48 - 57
        if ( c > 9 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
        if ( c > 2 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
        out = (out << 1) + (out << 3) + c; // <- alternatively this can just be out = c or c above can just be out;
    }

    for ( ; start < length; start++){
        c = (str.charAt(start) ^ '0');
        if ( c > 9 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
        out = (out << 1) + (out << 3) + c; 
    }

    if ( c1 == '-' ){
        out = ~out + 1;
        if ( out > 0 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
        return out;
    }

    if ( out < 0 ) throw new NumberFormatException( String.format("Not a valid integer value. Input: '%s'.", str) );
    return out;
}
0

Вы можете использовать метод parseInt

  String SrNumber="5790";
int extractNumber = Integer.parseInt(SrNumber);
System.out.println(extractNumber);//Result will be --5790
0

Преобразуйте строку в целое число с помощью метода parseInt класса Java Integer. Метод parseInt предназначен для преобразования String в int и создает NumberFormatException если строка не может быть преобразована в тип int.

Пропустив исключение, которое он может выдать, используйте это:

int i = Integer.parseInt(myString);

Если строка, обозначенная переменной myString является допустимым целым числом, таким как "1234", "200", "1", и она будет преобразована в Java int. Если по какой-либо причине происходит сбой, изменение может NumberFormatException, поэтому код должен быть немного длиннее, чтобы учесть это.

Ex. Метод преобразования Java String в int, контроль возможного исключения NumberFormatException

public class JavaStringToIntExample
{
  public static void main (String[] args)
  {
    // String s = "test";  // use this if you want to test the exception below
    String s = "1234";

    try
    {
      // the String to int conversion happens here
      int i = Integer.parseInt(s.trim());

      // print out the value after the conversion
      System.out.println("int i = " + i);
    }
    catch (NumberFormatException nfe)
    {
      System.out.println("NumberFormatException: " + nfe.getMessage());
    }
  }
}

Если попытка изменения не удалась - в случае, если вы можете попытаться преобразовать тест Java String в int - процесс Integer parseInt сгенерирует NumberFormatException, которое вы должны обработать в блоке try/catch.

0

Попробуйте этот код с различными входами String

        String a="10" , String a="10ssda" , String a=null; String a="12102    "

        if(null!=a){
        try{
         int x= Integer.ParseInt(a.trim()); 
         Integer y= Integer.valueOf(a.trim());
        //  It will throw a NumberFormatException in case of invalid string like ("10ssda" or "123 212") so, put this code into try catch
        }catch(NumberFormatException ex){
          // ex.getMessage();
        }
        }
0

Используйте Integer.parseInt(), это поможет вам разобрать значение строки в int.

Пример:

String str = "2017";
int i = Integer.parseInt(str);
System.out.println(i);

выход: 2017

0

Используйте эту строку для синтаксического анализа строкового значения для int:

 String x = "11111111";
 int y = Integer.parseInt(x);
 System.out.println(y);
0
String s="100";
try {
 int i=Integer.parseInt( s );
}catch( Exception e ) {
 System.out.println(e.getMessage());
}



String s="100L";
try {
  int i=Integer.parseInt( s );
 }catch( Exception e ) {
  System.out.println(e.getMessage());
}
-1

Я решаю эту проблему. Предлагаю вам попробовать следующий пример

  int number = Integer.parseInt("1234455");
  System.out.println(number);
-5

В качестве альтернативы вы можете использовать Integer.valueOf(). Он вернет объект Integer.

String numberStringFormat = "10";
Integer resultIntFormat = Integer.valueOf(numberStringFormat);
LOG.info("result:"+result);

Вывод:

10

  • 8
    Дубликат ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню