0
点赞
收藏
分享

微信扫一扫

各种进制的字符串转数字

一只1994 2022-03-12 阅读 41

本文以Integer为例。需要注意的点:

  1. 正负数处理
  2. 越界,Integer.MAX_VALUE为2147483647,Integer.MIN_VALUE为-2147483648。正数的容量比负数小1(因为正数包括0),所以计算的时候得使用负数计算,如果是正数再取反
  3. 对每一位转换的时候考虑范围必须在进制之内
package demo;

public class Solution {
    public static void main(String[] args) {
        int input = 1245;
        int radix = 16;
        String numStr = Integer.toHexString(input);
        System.out.println("result: " + solution(numStr, radix));
        System.out.println("original int: " + input);
        System.out.println("original numStr: " + numStr);
    }

    private static int solution(String numStr, int radix) {
        if (numStr == null || numStr.length() == 0) {
            throw new NumberFormatException();
        }

        if (radix < 2) {
            throw new IllegalArgumentException("进制不能小于2");
        }

        boolean negative = false;
        if (numStr.startsWith("-")) {
            negative = true;
            numStr = numStr.substring(1);
        } else if (numStr.startsWith("+")) {
            numStr = numStr.substring(1);
        }

        int res = 0;
        for (int i = 0; i < numStr.length(); i++) {
            char c = numStr.charAt(i);
            //为0的位不用计算
            if (c == '0') {
                continue;
            }
            int temp = char2Int(c, radix);
            //正数的容量比负数小1,使用负数计算
            res -= temp * Math.pow(radix, numStr.length() - 1 - i);
        }
        return negative ? res : -res;
    }

    private static int char2Int(char c, int radix) {
        int charInt = Character.digit(c, radix);
        if (charInt >= radix || charInt < 0) {
            throw new NumberFormatException("输入的字符串不是数字");
        }
        return charInt;
    }
}

输出结果:

result: 1245
original int: 1245
original numStr: 4dd
举报

相关推荐

0 条评论