Как работает Integer.parseInt (строка)?

Был задан этот вопрос недавно и не знал ответа. С высокого уровня может кто-то объяснить, как Java принимает символ / String и преобразовывает его в int.

Большое спасибо

Карл

Редактировать: Было бы также полезно узнать, делают ли другие языки аналогичные вещи.

Обычно это делается следующим образом:

  • результат init с 0
  • для каждого символа в строке выполните это
    • результат = результат * 10
    • получить цифру от символа (‘0’ – 48 ASCII (или 0x30), поэтому просто вычтите из символьного кода ASCII, чтобы получить цифру)
    • добавьте цифру в результат
  • результат возврата

Редактировать : это работает для любой базы, если вы замените 10 на правильную базу и отрегулируете получение цифры от соответствующего символа (должно работать так же, как и для оснований ниже 10, но потребуется небольшая корректировка для более высоких оснований – например, шестнадцатеричная – поскольку буквы отделяются от чисел на 7 символов).

Редактирование 2 : Преобразование символа в цифру: символы «0» – «9» имеют значения ASCII от 48 до 57 (от 0x30 до 0x39 в гекса), поэтому для преобразования символа в его разрядное значение требуется простое вычитание. Обычно это делается так (где ord – это функция, которая дает код ASCII символа):

 digit = ord(char) - ord('0') 

Для байт большего числа буквы используются как «цифры» (AF в гекса), но буквы начинаются с 65 (0x41 гекса), что означает, что есть пробел, который мы должны учитывать:

 digit = ord(char) - ord('0') if digit > 9 then digit -= 7 

Пример: «B» – 66, поэтому ord (‘B’) – ord (‘0’) = 18. Поскольку 18 больше 9, мы вычитаем 7, а конечный результат будет 11 – значение «цифры» B ,

Здесь еще одно замечание – это работает только для прописных букв, поэтому номер сначала должен быть преобразован в верхний регистр.

Исходный код Java API доступен. Вот метод parseInt (). Это довольно долго, потому что он должен обрабатывать множество исключительных и угловых случаев.

 public static int parseInt(String s, int radix) throws NumberFormatException { if (s == null) { throw new NumberFormatException("null"); } if (radix < Character.MIN_RADIX) { throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX"); } if (radix > Character.MAX_RADIX) { throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX"); } int result = 0; boolean negative = false; int i = 0, max = s.length(); int limit; int multmin; int digit; if (max > 0) { if (s.charAt(0) == '-') { negative = true; limit = Integer.MIN_VALUE; i++; } else { limit = -Integer.MAX_VALUE; } multmin = limit / radix; if (i < max) { digit = Character.digit(s.charAt(i++),radix); if (digit < 0) { throw NumberFormatException.forInputString(s); } else { result = -digit; } } while (i < max) { // Accumulating negatively avoids surprises near MAX_VALUE digit = Character.digit(s.charAt(i++),radix); if (digit < 0) { throw NumberFormatException.forInputString(s); } if (result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; if (result < limit + digit) { throw NumberFormatException.forInputString(s); } result -= digit; } } else { throw NumberFormatException.forInputString(s); } if (negative) { if (i > 1) { return result; } else { /* Only got "-" */ throw NumberFormatException.forInputString(s); } } else { return -result; } } 

Я не уверен, что вы ищете, как «высокий уровень». Я попробую:

  • взять строку, разобрать все символы один за другим
  • начать с 0
  • если оно находится между 0 и 9, total = (total x 10) + current
  • когда это сделано, итогом является результат
 public class StringToInt { public int ConvertStringToInt(String s) throws NumberFormatException { int num =0; for(int i =0; i=48)&&((int)s.charAt(i)<=59)) { num = num*10+ ((int)s.charAt(i)-48); } else { throw new NumberFormatException(); } } return num; } public static void main(String[]args) { StringToInt obj = new StringToInt(); int i = obj.ConvertStringToInt("1234123"); System.out.println(i); } } 
  • Найдите длину строки (например, maxSize)
  • Инициализировать результат = 0
  • begin loop (int j = maxSize, i = 0; j> 0; j–, i ++)
  • int digit = Character.digit (s.charAt (i))
  • result = result + digit * (10 power j-1)
  • конец петли
  • результат возврата

это моя простая реализация parse int

 public static int parseInteger(String stringNumber) { int sum=0; int position=1; for (int i = stringNumber.length()-1; i >= 0 ; i--) { int number=stringNumber.charAt(i) - '0'; sum+=number*position; position=position*10; } return sum; } 

Вот что я придумал (Примечание: никаких проверок для алфавитов не выполняется)

 int convertStringtoInt(String number){ int total =0; double multiplier = Math.pow(10, number.length()-1); for(int i=0;i 
  • В чем разница между istringstream, ostringstream и stringstream? / Почему бы не использовать stringstream в каждом случае?
  • Как найти целое слово в строке в java
  • Как подсчитать уникальные символы в строке
  • Java String удаляет все нецифровые символы
  • Как преобразовать String в int в Java?
  • Как использовать первый символ каждого слова в строке
  • C ++ .NET convert System :: String to std :: string
  • Как объединить строки?
  • Удаление символов строки строки из строки Java
  • Почему метод concat () Java не делает ничего?
  • Как обрезать пробелы из переменной Bash?
  • Давайте будем гением компьютера.