You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jzzh/BaseConversion2.java

115 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BaseConversion2 {
// 将指定进制的数字转换为十进制
public static int convertToDecimal(String number, int base) {
int decimalValue = 0;
int power = 1; // 初始值为1对应于base^0
for (int i = number.length() - 1; i >= 0; i--) {
char digit = number.charAt(i);
int digitValue = Character.isDigit(digit)
? digit - '0'
: Character.toUpperCase(digit) - 'A' + 10; // A-F
decimalValue += digitValue * power;
power *= base; // 更新权重
}
return decimalValue;
}
// 将十进制转换为指定进制
public static String convertFromDecimal(int number, int base) {
if (number == 0) return "0"; // 特殊情况处理
StringBuilder result = new StringBuilder();
while (number > 0) {
int remainder = number % base;
result.append(remainder < 10 ? (char) ('0' + remainder) : (char) ('A' + remainder - 10));
number /= base;
}
return result.reverse().toString(); // 反转结果
}
// 主方法,创建用户界面
public static void main(String[] args) {
JFrame frame = new JFrame("基数转换器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLayout(new GridLayout(5, 2));
// 创建界面组件
JLabel sourceBaseLabel = new JLabel("源进制 (2-16):");
JTextField sourceBaseField = new JTextField();
JLabel targetBaseLabel = new JLabel("目标进制 (2-16):");
JTextField targetBaseField = new JTextField();
JLabel numberLabel = new JLabel("要转换的数字:");
JTextField numberField = new JTextField();
JButton convertButton = new JButton("转换");
JLabel resultLabel = new JLabel("转换结果:");
// 事件处理
convertButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int sourceBase = Integer.parseInt(sourceBaseField.getText());
int targetBase = Integer.parseInt(targetBaseField.getText());
String number = numberField.getText().toUpperCase();
// 输入验证
if (!isValidInput(number, sourceBase)) {
resultLabel.setText("请输入有效的数字!");
return;
}
int decimalValue = convertToDecimal(number, sourceBase);
String result = convertFromDecimal(decimalValue, targetBase);
resultLabel.setText("转换结果: " + result);
} catch (NumberFormatException ex) {
resultLabel.setText("进制应为数字,且范围为 2-16!");
} catch (Exception ex) {
resultLabel.setText("转换过程中发生错误: " + ex.getMessage());
}
}
});
// 添加组件到框架
frame.add(sourceBaseLabel);
frame.add(sourceBaseField);
frame.add(targetBaseLabel);
frame.add(targetBaseField);
frame.add(numberLabel);
frame.add(numberField);
frame.add(convertButton);
frame.add(resultLabel);
frame.setVisible(true);
}
// 检查用户输入的数字是否有效
private static boolean isValidInput(String number, int base) {
for (char digit : number.toCharArray()) {
int digitValue = Character.isDigit(digit)
? digit - '0'
: Character.toUpperCase(digit) - 'A' + 10;
if (digitValue < 0 || digitValue >= base) {
return false; // 数字超出进制范围
}
}
return true; // 输入有效
}
}