虽然最后还是完成了,但是是真的难受,为啥写个转换这么复杂,有没有简单一点的方法。。。还有就是帮我看看有没有bug
/**
* 进制自动转换
* @author hang
* 2017/5/18
*/
package com.hy.Test;
import java.util.ArrayList;
import java.util.Scanner;
public class Test6 {
/**
* main主程序
* @param args
*/
public static void main(String[] args) {
while(true){
System.out.println("请输入数据(如果数据太大会无法转换):");
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
String kind=findkind(str);
if(kind.equals("else")){
System.out.println("输入错误,请重新输入");
continue;
}
System.out.println("输入为"+kind);
System.out.println("请输入要转换的进制格式:");
String fkind=sc.nextLine();
if(!fkind.equals("二进制")&&!fkind.equals("十进制")&&!fkind.equals("十六进制")&&!fkind.equals("八进制")){
System.out.println("进制输入错误,请重新开始输入");
continue;
}
if(fkind.equals(kind)){
System.out.println("进制相同,无需转换");
continue;
}
String tfnum=transform(str,kind,fkind);
System.out.println(kind+":"+str+"转换为----"+fkind+":"+tfnum);
}
}
/**
* 字符型转为int型
* @param c
* @return d
*/
private static int tcti(char c){
int i=0;
int d=0;
char chh='0';
while(true){
if(c==chh){
d=i;
break;
}else{
chh=(char) (chh+1);
i++;
}
}
return d;
}
/**
* int型转换为字符型
*
*/
private static char titc(int x){
int i=0;
char ch='0';
char c;
while(true){
if(x==i){
c=ch;
break;
}else{
ch=(char) (ch+1);
i++;
}
}
return c;
}
/**
* 找到输入数据的进制类型
* 0b为二进制,0为八进制,整数为十进制,0x为十六进制
* @param str
* @return kind
*/
private static String findkind(String str){
char [] ch=str.toCharArray();
String kind="else";
if(ch[0]=='0'&&ch.length>1&&ch[1]!='b'&&ch[1]!='x'){
kind="八进制";
for(int i=1;i<ch.length;i++){
if(ch[i]>'7'||ch[i]<'0'){
kind="else";
}
}
return kind;
}
if(ch[0]=='0'&&ch[1]=='b'&&ch.length>2){
if(ch[1]=='b'){
kind="二进制";
}
for(int i=2;i<ch.length;i++){
if(ch[i]>'1'||ch[i]<'0'){
kind="else";
}
}
return kind;
}
if(ch[0]=='0'&&ch[1]=='x'&&ch.length>2){
if(ch[1]=='x'){
kind="十六进制";
}
for(int i=2;i<ch.length;i++){
if(ch[i]<'0'||(ch[i]>'9'&&ch[i]<'a')||ch[i]>'f'){
kind="else";
}
}
return kind;
}
if(ch[0]>='0'&&ch[0]<='9'&&ch.length>1){
kind="十进制";
for(int i=1;i<ch.length;i++){
if(ch[i]>'9'||ch[i]<'0'){
kind="else";
break;
}
}
return kind;
}
if(ch.length==1&&ch[0]<='9'&&ch[0]>='0'){
kind="十进制";
return kind;
}
return kind;
}
/**
* 进制转换,ArrayList接收
* @param str
* @param kind
* @return ssss
*/
private static String transform(String str,String kind,String fkind){
String ssss="";
int sum=0;
char [] ch=str.toCharArray();
int leng=ch.length;
char [] tench = null;
if(kind.equals("二进制")){
for(int i=2;i<leng;i++){
sum+=Math.pow(2, leng-i-1)*tcti(ch[i]);
}
}else if(kind.equals("八进制")){
for(int i=1;i<leng;i++){
sum+=Math.pow(8, leng-i-1)*tcti(ch[i]);
}
}else if(kind.equals("十六进制")){
for(int i=2;i<leng;i++){
int st;//十六进制每位的数据
switch(ch[i]){
case 'a':
st=10;
break;
case 'b':
st=11;
break;
case 'c':
st=12;
break;
case 'd':
st=13;
break;
case 'e':
st=14;
break;
case 'f':
st=15;
break;
default:
st=tcti(ch[i]);
}
sum+=Math.pow(16, leng-i-1)*st;
}
}else{//十进制
for(int i=0;i<leng;i++){
sum+=Math.pow(10, leng-i-1)*tcti(ch[i]);
}
}
if(fkind.equals("十进制")){
for(int i=11;i>=0;i--){//这段循环是为了给字符数组分配内存
for(int j=9;j>0;j--){
if((sum-Math.pow(10, i)*j)>=0){
tench=new char[i+1];
break;
}
}
if(tench!=null){
break;
}
}
for(int i=tench.length-1;i>=0;i--){
for(int j=9;j>=0;j--){
if((sum-Math.pow(10, i)*j)>=0){
sum-=Math.pow(10, i)*j;
tench[tench.length-i-1]=titc(j);
break;
}
}
}
}else if(fkind.equals("十六进制")){
for(int i=11;i>=0;i--){//这段循环是为了给字符数组分配内存
for(int j=15;j>0;j--){
if((sum-Math.pow(16, i)*j)>=0){
tench=new char[i+3];
break;
}
}
if(tench!=null){
break;
}
}
tench[0]='0';
tench[1]='x';
for(int i=tench.length-3;i>=0;i--){
for(int j=15;j>=0;j--){
if((sum-Math.pow(16, i)*j)>=0){
sum-=Math.pow(16, i)*j;
switch(j){
case 10:
tench[tench.length-i-1]='a';
break;
case 11:
tench[tench.length-i-1]='b';
break;
case 12:
tench[tench.length-i-1]='c';
break;
case 13:
tench[tench.length-i-1]='d';
break;
case 14:
tench[tench.length-i-1]='e';
break;
case 15:
tench[tench.length-i-1]='f';
break;
default:
tench[tench.length-i-1]=titc(j);
}
break;
}
}
}
}else if(fkind.equals("八进制")){
for(int i=13;i>=0;i--){//这段循环是为了给字符数组分配内存
for(int j=7;j>0;j--){
if((sum-Math.pow(8, i)*j)>=0){
tench=new char[i+2];
break;
}
}
if(tench!=null){
break;
}
}
tench[0]='0';
for(int i=tench.length-2;i>=0;i--){
for(int j=7;j>=0;j--){
if((sum-Math.pow(8, i)*j)>=0){
sum-=Math.pow(8, i)*j;
tench[tench.length-i-1]=titc(j);
break;
}
}
}
}else{
for(int i=32;i>=0;i--){//这段循环是为了给字符数组分配内存
for(int j=1;j>0;j--){
if((sum-Math.pow(2, i)*j)>=0){
tench=new char[i+3];
break;
}
}
if(tench!=null){
break;
}
}
tench[0]='0';
tench[1]='b';
for(int i=tench.length-3;i>=0;i--){
for(int j=1;j>=0;j--){
if((sum-Math.pow(2, i)*j)>=0){
sum-=Math.pow(2, i)*j;
tench[tench.length-i-1]=titc(j);
break;
}
}
}
}
ssss=String.valueOf(tench);
return ssss;
}
}
结果显示:
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
十进制
十六进制:0x4f转换为----十进制:79
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
二进制
十六进制:0x4f转换为----二进制:0b1001111
请输入数据(如果数据太大会无法转换):
0x4f
输入为十六进制
请输入要转换的进制格式:
八进制
十六进制:0x4f转换为----八进制:0117
请输入数据(如果数据太大会无法转换):
|
|