Как работает Integer.parseInt(строка)?
Недавно был задан этот вопрос и не знал ответа. С высокого уровня может кто-то объяснить, как Java принимает символ /String и преобразовывает его в int.
Большое спасибо
Карл
Edit: Было бы также полезно знать, делают ли другие языки аналогичные вещи.
Ответы
Ответ 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;
}