把2~16进制的字符串转换成10进制整数

代码:

public class Test<T> {

    public static void main(String[] args) {

        // 测试数据
        String s1 = "-80";
        String s2 = "-1";
        String s3 = "+7f";
        String s4 = "3e8";

        // 输出测试数据
        System.out.println("16进制" + s1 + "的10进制数是:" + parseInt(s1, 16));
        System.out.println("16进制" + s2 + "的10进制数是:" + parseInt(s2, 16));
        System.out.println("16进制" + s3 + "的10进制数是:" + parseInt(s3, 16));
        System.out.println("16进制" + s4 + "的10进制数是:" + parseInt(s4, 16));
    }

    /**
     * 将字符串s按照radix进制数转换成10进制数(注意:该方法只能把2~16进制之间的字符串转换成10进制数)
     *
     * @param s     需要进行转换的字符串
     * @param radix 该字符串的进制数
     * @return
     * @throws NumberFormatException
     */
    public static int parseInt(String s, int radix) throws NumberFormatException {

        // 如果字符串不为空,不抛出异常
        if (s == null)
            throw new NumberFormatException("null");

        // 如果进制数在2~16之间,不抛出异常
        if (radix < 2 || radix > 16)
            throw new NumberFormatException("radix=" + radix + ",进制超出2~16范围。");

        // value存储十进制数,i存储所遍历数组的下标
        int value = 0, i = 0;

        // sign存储该字符串的正负关系
        int sign = s.charAt(0) == '-' ? -1 : 1;

        // 如果字符串中的第一个字符是+或者-,那就让i加1,从而在遍历的时候跳过这个下标
        if (s.charAt(0) == '+' || s.charAt(0) == '-') {
            if (s.length() == 1) {
                throw new NumberFormatException("\"" + s + "\"");
            } else {
                i++;
            }
        }

        // 从字符串最开始遍历
        while (i < s.length()) {
            // 获得第一个字符
            char ch = s.charAt(i++);
            // 处理从'0'~'9'之间的所有字符
            if (ch >= '0' && ch - '0' < radix) {
                // radix代表该进制数
                value = value * radix + ch - '0';
            }
            // 处理'a'~'f'之间的所有字符
            else if (radix > 10 && radix <= 16 && ch >= 'a' && ch - 'a' < radix - 10) {
                value = value * radix + ch - 'a' + 10;
            }
            // 处理'A'~'F'之间的所有字符
            else if (radix > 10 && radix <= 16 && ch >= 'A' && ch - 'A' < radix - 10) {
                value = value * radix + ch - 'A' + 10;
            }
            // 除'0'~'9'、'a'~'z'、'A'~'Z'之外的字符都抛出异常
            else {
                throw new NumberFormatException(radix + "进制整数不能识别" + ch);
            }
        }

        // 返回处理完成的10进制数,其中sign是1或者-1,代表正负
        return value * sign;
    }
}

结果:

16进制-8010进制数是:-128
16进制-110进制数是:-1
16进制+7f10进制数是:127
16进制3e810进制数是:1000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值