java实现各种进制转换

java基础练习 专栏收录该内容
4 篇文章 0 订阅

进制转化

    最近在学习java语言的基础,用学到的基础知识做了一个进制转化器,分享一下

package day1;

import java.util.Scanner;

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

    public static void main(String[] args) {
        while(true) {
            showMenu();
            boolean exit = inputCommand();
            if(exit){
                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){
            if(radix == 16){
                int reminder = d%radix;
                if(reminder >=0 && reminder < 10){
                    result = reminder+result;
                }
            }
            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;
    }
}

十进制转换十六进制时,还是会出现一些问题

  • 2
    点赞
  • 0
    评论
  • 10
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

无名一小卒

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值