Integer.parseInt(string)实际上是如何工作的?

时间:2009-09-11 12:24:58

标签: java string parsing

最近被问到这个问题并且不知道答案。从高层可以解释Java如何获取字符/字符串并将其转换为int。

非常感谢

卡尔

编辑:也很高兴知道其他语言是否也做类似的事情。

7 个答案:

答案 0 :(得分:41)

通常这样做:

  • 初始结果为0
  • 对于字符串中的每个字符执行此操作
    • result = result * 10
    • 从字符中获取数字('0'为48 ASCII(或0x30),因此只需从字符ASCII代码中减去该数字即可获得数字)
    • 将数字添加到结果
  • 返回结果

编辑:如果您使用正确的基数替换10并且从相应的字符中调整数字的获取(这应该适用于低于10的基数,但是需要),这适用于任何基数稍微调整一下更高的基数 - 比如十六进制 - 因为字母与数字分开7个字符)。

编辑2 :字符数字转换:字符“0”到“9”的ASCII值为48到57(0x30为0x30到0x39),所以为了将字符转换为数字值需要简单的减法。通常它是这样完成的(其中ord是给出字符ASCII码的函数):

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

对于更高的数字基数,字母用作'数字'(六进制中的A-F),但字母从65开始(0x41 hexa),这意味着我们必须考虑到的差距:

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

示例:'B'为66,因此ord('B') - ord('0')= 18.由于18大于9,我们减去7,最终结果为11 - '的值'数字'B。

这里还要注意一件事 - 这只适用于大写字母,因此必须先将数字转换为大写字母。

答案 1 :(得分:25)

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;
}
}

答案 2 :(得分:8)

我不确定你在寻找什么,就像“高水平”一样。我试试看:

  • 取String,逐个解析所有字符
  • 从总共0开始
  • 如果介于0和9之间,total = (total x 10) + current
  • 完成后,总计是结果

答案 3 :(得分:6)

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);
    }

}

答案 4 :(得分:3)

  • 查找字符串的长度(比如maxSize)
  • 初始化result = 0
  • 开始循环( int j=maxSize, i =0 ; j > 0; j--, i++)
  • int digit = Character.digit(s.charAt(i))
  • result= result + digit * (10 power j-1)
  • 结束循环
  • 返回结果

答案 5 :(得分: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;
}

答案 6 :(得分:0)

以下是我的想法(注意:没有对字母进行检查)

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;
    }