java基础进制转换器

 
 
public class E201_进制转换器 {
    static int from;//待转换的进制
    static int to;//转换后的进制

    public static void main(String[] args) {
        while(true) {
            showMenu();
            boolean isExist = inputCommand();
            if(isExist){
                break;
            }
            String data = inputData(from);
            String result = convert(from,to,data);
            System.out.printf("%s(%d)→%s(%d)\n",data,from,result,to);
        }
    }
    /**
     * 功能:显示操作菜单
     */
    private static void showMenu(){
        System.out.println("*--------------------------------------------*");
        System.out.println("* A:十进制 => 二进制 B:二进制   => 十进制 *");
        System.out.println("* C:十进制 => 八进制 D:八进制   => 十进制 *");
        System.out.println("* E:十进制 => 十六进制    F:十六进制 => 十进制 *");
        System.out.println("* G:二进制 => 八进制 H:八进制   => 二进制 *");
        System.out.println("* I:二进制 => 十六进制    J:十六进制 => 二进制 *");
        System.out.println("* K:退出                                     *");
        System.out.println("*--------------------------------------------*");
    }

    /**
     * 功能:接收转换命令的输入
     * @return 是否是结束命令
     */
    private static boolean inputCommand(){
        Scanner scan = new Scanner(System.in);
        String command = scan.next().toUpperCase();
        switch(command)
        {
            case "A":
                from = 10;
                to = 2;
                break;
            case "B":
                from = 2;
                to = 10;
                break;
            case "C":
                from = 10;
                to = 8;
                break;
            case "D":
                from = 8;
                to = 10;
                break;
            case "E":
                from = 10;
                to = 16;
                break;
            case "F":
                from = 16;
                to = 10;
                break;
            case "G":
                from = 2;
                to = 8;
                break;
            case "H":
                from = 8;
                to = 2;
                break;
            case "I":
                from = 2;
                to = 16;
                break;
            case "J":
                from = 16;
                to = 2;
                break;
            case "K":
                return true;
            default:
                System.out.println("错误命令!");
                return inputCommand();
        }
        return false;
    }

    /**
     * 功能:接收待转换数据的输入,需验证
     * @param radix 进制(验证的依据)
     * @return 输入的数据
     */
    private static String inputData(int radix){
        Scanner scan = new Scanner(System.in);
        String data = null;
        boolean success = false;
        while (!success){
            System.out.printf("请输入一个%d进制数:", radix);
            data = scan.next();
            success = validate(from,data);
        }

        return data;
    }

    /**
     * 功能:进制转换
     * @param from 源进制
     * @param to 目标进制
     * @param data 待转换的数
     * @return 转换之后的结果
     */
    private static String convert(int from, int to, String data) {
        if(10 == from){
            return decimal2x(to,data);
        }
        if(10 == to) {
            return x2decimal(from, data);
        }
        return decimal2x(to,x2decimal(from,data));
    }

    /**
     * 功能:将其它进制转换为十进制
     * @param radix 进制
     * @param data 待转换的数据
     * @return 转换之后的结果
     */
    private static String x2decimal(int radix, String data){
        int num = 0;
        int len = data.length();
        for (int i=0; i<len; i++)
        {
            char ch = data.charAt(i);
            if (ch >= 'a')
            {
                num += (ch-'a'+10)*(int)Math.pow(radix,len-i-1);
            }
            else
            {
                num += (ch-'0')*(int)Math.pow(radix,len-i-1);
            }
        }
        return String.format("%d",num);
    }

    /**
     *功能:将十进制数转换为其它进制
     * @param radix 进制
     * @param data 待转换的数据
     * @return 转换之后的结果
     */
    private static String decimal2x(int radix, String data){
        String result = "";
        int d = Integer.parseInt(data);
        while(d != 0){
            int reminder = d%radix;
            d /= radix;
            result = reminder+result;
        }
        return result;
    }

    /**
     * 功能:验证数据的合法性
     * @param radix 进制(验证的依据)
     * @param data 待验证的数据
     * @return 是否合法
     */
    private static boolean validate(int radix, String data){
        data = data.toLowerCase();
        for(int i=0; i<data.length(); i++){
            char ch = data.charAt(i);
            if(!isDigit(radix, ch)){
                return false;
            }
        }
        return true;
    }

    /**
     * 判断是否为合法字符
     * @param radix 进制(判断的依据)
     * @param ch 待判断的字符
     * @return 是否合法
     */
    private static boolean isDigit(int radix, char ch) {
        if(16 == from){
            return (ch>='0' && ch<='9') || (ch>='a' && ch<='f');
        }
        int n = ch-'0';
        return n>=0 && n<from;
    }
}

运行结果:

猜你喜欢

转载自blog.csdn.net/leizhenjiang/article/details/80163662