Подтвердить что ты не робот

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

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

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

Карл

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

4b9b3361

Ответ 1

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

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

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

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

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

Для байт большего числа буквы используются как "цифры" (A-F в гекса), но буквы начинаются с 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.

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

Ответ 2

Исходный код 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;
}
}

Ответ 3

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

  • возьмем строку, проанализируем все символы один за другим
  • начать с 0
  • если он находится между 0 и 9, total = (total x 10) + current
  • Когда сделано, итого результат

Ответ 4

public class StringToInt {

    public int ConvertStringToInt(String s) throws NumberFormatException
    {
        int num =0;
        for(int i =0; i<s.length();i++)
        {
            if(((int)s.charAt(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);
    }

}

Ответ 5

  • Найдите длину строки (например maxSize)
  • Инициализировать результат = 0
  • begin loop (int j = maxSize, я = 0; j > 0; j--, я ++)
  • int digit = Character.digit(s.charAt(i))
  • result = result + digit * (10 power j-1)
  • конец цикла
  • результат возврата

Ответ 6

это моя простая реализация 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;
}

Ответ 7

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

int convertStringtoInt(String number){

    int total =0;
    double multiplier = Math.pow(10, number.length()-1);
        for(int i=0;i<number.length();i++){

            total = total + (int)multiplier*((int)number.charAt(i) -48);
            multiplier/=10;

        }

        return total;
    }