进制转化
最近在学习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;
}
}
十进制转换十六进制时,还是会出现一些问题