java学习——99.进制间的转换
计算机中的计算机器是可以直接实现进制间转换的功能的。
也可以自己写用户界面来实现各种进制之间的转换。
本篇即采用用户界面来实现进制的转换,代码有点长,感兴趣的朋友看看,主要是结合了前两篇的转换,再加上了用户界面。
完整代码如下:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class 进制转换 extends JFrame implements ActionListener,FocusListener{
private JTextField text,jieguo;//一个用作输入,一个用作显示
private JRadioButton radio[];//用单选按钮组来选择转换的进制
private JLabel l;//主要用作提示
private int radix;//进制
public 进制转换(){
super("进制转换");
this.setVisible(true);
this.setSize(400,150);
this.setLocation(200,200);
JPanel top=new JPanel();
top.add(new JLabel("请输入:"));
text=new JTextField(20);
text.addFocusListener(this);//添加焦点动作事件,目的是为了在输入数据有误的情况下,清空提示文本框
top.add(text);
this.getContentPane().add(top,"North");
JPanel pane=new JPanel();
this.getContentPane().add(pane);
String s[]={"二进制","八进制","十进制","十六进制"};
ButtonGroup group=new ButtonGroup();
radio=new JRadioButton[s.length];
for(int i=0;i<s.length;i++){
radio[i]=new JRadioButton(s[i]);
group.add(radio[i]);
pane.add(radio[i]);
radio[i].addActionListener(this);
}
l=new JLabel();
pane.add(l);
jieguo=new JTextField(20);
this.getContentPane().add(jieguo,"South");
}
public void actionPerformed(ActionEvent e){//响应动作事件
String s=text.getText();
int n=parseInt(s);//调用方法将文本框中的数据转换成十进制
if(l.getText()==""){//在提示为空的情况下,才进行转换
if(e.getSource().equals(radio[0])){//如果单击的是二进制按钮
jieguo.setText(s+parseInto(n,2));//转换为二进制,调用方法parseInto(n,2)
}
if(e.getSource().equals(radio[1])){
jieguo.setText(s+parseInto(n,8));//转换为八进制,调用方法parseInto()
}
if(e.getSource().equals(radio[2])){
jieguo.setText(s+parseInto(n,10));//转换为十进制,调用方法parseInto()
}
if(e.getSource().equals(radio[3])){
jieguo.setText(s+parseInto(n,16));//转换为十六进制,调用方法parseInto()
}
}
}
public int parseInt(String s)//将文本框中的数据转换为十进制
{
if(s.length()==0){//如果文本框中未输入数据,要提示输入
l.setForeground(Color.red);
l.setText("您未输入数据,请输入");
return 0;
}
else{
charch=s.charAt(0);
int value=0, i=0,sign=1;
radix=10;
if (ch>='1' && ch<='9' || ch=='+' || ch=='-'||ch=='0'&&s.length()==0)
{
radix=10;
if (ch=='+' || ch=='-')
i++;
sign = ch=='-' ? -1 : 1;
}
elseif (ch=='0' &&s.charAt(1)!='x')
{
radix=8;
i++;
}
elseif (ch=='0' &&s.charAt(1)=='x')
{
radix=16;
i+=2;
}
else {
l.setForeground(Color.red);
l.setText("整数不能识别\'"+ch+"\'字符");
}
while(i<s.length())
{
ch=s.charAt(i++);
if (ch>='0' && ch-'0'<radix)
value =value*radix+ch-'0';
elseif (radix==16 &&ch>='a' && ch<='f')
value =value*radix+ch-'a'+10;
elseif (radix==16 &&ch>='A' && ch<='F')
value =value*radix+ch-'A'+10;
else
{
l.setForeground(Color.red);
l.setText(radix+"进制整数不能识别'"+ch+"\'字符");
}
}
return value*sign;
}
}
public String parseInto(int value,int radix) {//转换进制的方法,其中value是整数,radix是要转化的进制
if(radix==10)//因为输入的即为十进制数,所以不需要转换,直接输出即可。
return"的十进制数是"+value;
elseif(radix==2||radix==8||radix==16) {//如果是其他进制,都是用除radix取余法
int n=value;//用n来存储value的值,目的是为了后面的转换
String s="";//用字符串来存储转换之后的进制值
while(n>0) {//当n>0时,执行此循环
if((n%radix)>=10) {//因为采用“除radix取余法”,二进制和八进制数可直接用其余数,而十六进制不可以,本if语句主要是10~15转换为a~f这六个十六进制中的符号
switch(n%radix) {
case 10:s+='a';break;
case 11:s+='b';break;
case 12:s+='c';break;
case 13:s+='d';break;
case 14:s+='e';break;
case 15:s+='f';break;
}
n=n/radix;
}
else {//二进制或者八进制可直接取余,但用此方法取出来的字符均是顺序放在字符串s中的
s+=n%radix;
n=n/radix;
}
}
String s1="";
for(int i=s.length()-1;i>=0;i--)//将s中的字符倒换顺序,得到正确的“除radix取余法”的解
s1+=s.charAt(i);
return"的"+radix+"进制数是"+s1;//将结果输出
}
else
return value+"不能转换为"+radix+"进制";//本例只输出二进制、八进制或者十六进制,计算机当中一般也不用其他进制,如果radix的值为其他,则会提示输出错误
}
publicstaticvoid main(String args[]){
new进制转换();
}
@Override
publicvoid focusGained(FocusEvent e) {
// TODO Auto-generatedmethod stub
l.setText("");
}
@Override
publicvoid focusLost(FocusEvent e) {
// TODO Auto-generatedmethod stub
}
}
其运行结果如下:

如果输入一个错误数据,会提示错误:

如果未输入数据,也会提示:

若输入十进制数据10,其转换结果如下:



当输入其他的数据,比如八进制,十六进制时,也能得到正确的结果,感兴趣的朋友可以复制并代码运行试试。