代码:
public class Test<T> {
public static void main(String[] args) {
// 测试数据
String s1 = "-80";
String s2 = "-1";
String s3 = "+7f";
String s4 = "3e8";
// 输出测试数据
System.out.println("16进制" + s1 + "的10进制数是:" + parseInt(s1, 16));
System.out.println("16进制" + s2 + "的10进制数是:" + parseInt(s2, 16));
System.out.println("16进制" + s3 + "的10进制数是:" + parseInt(s3, 16));
System.out.println("16进制" + s4 + "的10进制数是:" + parseInt(s4, 16));
}
/**
* 将字符串s按照radix进制数转换成10进制数(注意:该方法只能把2~16进制之间的字符串转换成10进制数)
*
* @param s 需要进行转换的字符串
* @param radix 该字符串的进制数
* @return
* @throws NumberFormatException
*/
public static int parseInt(String s, int radix) throws NumberFormatException {
// 如果字符串不为空,不抛出异常
if (s == null)
throw new NumberFormatException("null");
// 如果进制数在2~16之间,不抛出异常
if (radix < 2 || radix > 16)
throw new NumberFormatException("radix=" + radix + ",进制超出2~16范围。");
// value存储十进制数,i存储所遍历数组的下标
int value = 0, i = 0;
// sign存储该字符串的正负关系
int sign = s.charAt(0) == '-' ? -1 : 1;
// 如果字符串中的第一个字符是+或者-,那就让i加1,从而在遍历的时候跳过这个下标
if (s.charAt(0) == '+' || s.charAt(0) == '-') {
if (s.length() == 1) {
throw new NumberFormatException("\"" + s + "\"");
} else {
i++;
}
}
// 从字符串最开始遍历
while (i < s.length()) {
// 获得第一个字符
char ch = s.charAt(i++);
// 处理从'0'~'9'之间的所有字符
if (ch >= '0' && ch - '0' < radix) {
// radix代表该进制数
value = value * radix + ch - '0';
}
// 处理'a'~'f'之间的所有字符
else if (radix > 10 && radix <= 16 && ch >= 'a' && ch - 'a' < radix - 10) {
value = value * radix + ch - 'a' + 10;
}
// 处理'A'~'F'之间的所有字符
else if (radix > 10 && radix <= 16 && ch >= 'A' && ch - 'A' < radix - 10) {
value = value * radix + ch - 'A' + 10;
}
// 除'0'~'9'、'a'~'z'、'A'~'Z'之外的字符都抛出异常
else {
throw new NumberFormatException(radix + "进制整数不能识别" + ch);
}
}
// 返回处理完成的10进制数,其中sign是1或者-1,代表正负
return value * sign;
}
}
结果:
16进制-80的10进制数是:-128
16进制-1的10进制数是:-1
16进制+7f的10进制数是:127
16进制3e8的10进制数是:1000