Java.lang.Integer类中toString(int i, int radix)的具体实现

Java.lang.Integer.toString(int i,int radix)方法可以实现将一个int类型的10进制的数据转换为指定进制的数据。

api文档中介绍:

返回第二个参数指定的基数中第一个参数的字符串表示形式。
如果基数小于Character.MIN_RADIX(2)或大于Character.MAX_RADIX(36),则改用基数10。
如果第一个参数为负,则结果的第一个元素为前加上一个负号“-”。如果第一个参数不为负,则结果中不会出现负号。
结果的其余字符代表第一个参数的大小。如果大小为零,则用单个零字符‘0‘表示;否则,表示幅度的第一个字符将不是零字符。
如果基数为N,则按所示顺序将这些字符的前N个用作基数N个数字。因此,十六进制的数字(基数16)为0123456789abcdef。如果需要大写字母,可以在结果上调用String.toUpperCase()方法: Integer.toString(n,16).toUpperCase()

 toString(int i,int radix)方法的源码:

 

public static String toString(int i, int radix) {
         /* 最大进制36,最小进制2,见Character类*/
        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
            radix = 10;

        /* Use the faster version */
        if (radix == 10) {
            return toString(i);
        }
       
        /*创建一个用于存放转换为指定字符的字符型数组*/
        char buf[] = new char[33];
         /* 判断传入的数据是正是负*/
        boolean negative = (i < 0);
        /*传入数据时字符数组中的位置 */
        int charPos = 32;

         /*不管正负,全部转换为负数 */
        if (!negative) {
            i = -i;
        }

         /* 当传入的数据或者除以进制之后得到的整数大于指定的进制时继续循环 */
        while (i <= -radix) {
            buf[charPos--] = digits[-(i % radix)];
            i = i / radix;
        }
         /* 将最后一个余数添加到数组中 */
        buf[charPos] = digits[-i];

         /* 当传入的数据是负数时,需要在前面添加一个负号 */
        if (negative) {
            buf[--charPos] = ‘-‘;
        }

        return new String(buf, charPos, (33 - charPos));
    }       

 

Integer类中的digits数组为:
final static char[] digits = {
        ‘0‘ , ‘1‘ , ‘2‘ , ‘3‘ , ‘4‘ , ‘5‘ ,
        ‘6‘ , ‘7‘ , ‘8‘ , ‘9‘ , ‘a‘ , ‘b‘ ,
        ‘c‘ , ‘d‘ , ‘e‘ , ‘f‘ , ‘g‘ , ‘h‘ ,
        ‘i‘ , ‘j‘ , ‘k‘ , ‘l‘ , ‘m‘ , ‘n‘ ,
        ‘o‘ , ‘p‘ , ‘q‘ , ‘r‘ , ‘s‘ , ‘t‘ ,
        ‘u‘ , ‘v‘ , ‘w‘ , ‘x‘ , ‘y‘ , ‘z‘
    };

Character类中的MIN_RADIXMAX_RADIX两个field为:

 public static final int MIN_RADIX = 2;

 public static final int MAX_RADIX = 36;
相关文章
相关标签/搜索