【需求】:
(1)如果输入的字符串为null,为空,或者不是数字,抛出异常;
(2)如果输入的数字超出int的最大值或最小值,抛出异常;
(3)输入的数字允许以+或-号开头,但如果输入的字符串只有"+"或"-"号,则抛出异常;
【实现思路】:
关键:字符串 -> 字符 -> 整数。
输入的字符串中的每一个字符都应该是从'0'到'9'这10个字符中的某一个,而这10个字符的ASCII码是有序的,所以后一个字符的ACSII码减去前一个字符的ASCII码一定等于1,根据这个特性,让两个字符做减法运算就能得到一个int类型的值,进而推导出让一个数字字符对'0'做减法,就能到该字符对应的那个整数,比如'5'减去'0'等于5。
又由于一个整数有低位和高位的概念,比如个位、十位、百位、千位等,而任意整数都会满足如下规律:
个位就是个位上的数字乘以10的0次幂,十位就是十位上的数字乘以10的1次幂,百位就是百位上的数字乘以10的2次幂,千位就是千位上的数字乘以10的3次幂,以此类推
最后将上面运算的结果累加起来,就是最终的整数,比如 3256=3*1000+2*100+5*10+6。
【代码实现】
/**
* 自己实现字符串转整数
* 基本思路: 字符串 -> 字符 -> 整数
* 整数拆分规律: 3256 = 3*10^3 + 2*10^2 + 5*10^1 + 6*10^0
* @param s
* @return
*/
public static int parseInt(String s) {
//保留原始参数
String str = s;
if (str == null || str == "") throw new NumberFormatException("For input string:\"" + s + "\"");
//是否为负数
boolean negative = false;
// 是否以+号或-号开头
if(str.startsWith("+") || str.startsWith("-")) {
if (str.startsWith("-")) negative = true;
str = str.substring(1);
// 以+或-开头,但是后面没有数字
if (str == "" || str.length() == 0) throw new NumberFormatException("For input string:\"" + s + "\"");
}
char[] chars = str.toCharArray();
long result = 0;
for (int i = 0; i < chars.length; i++) {
// 是否是'0'到'9'之间的字符
if (chars[i] < '0' || chars[i] > '9') throw new NumberFormatException("For input string:\"" + s + "\"");
// 先根据字符之间进行运算来得到int值,再根据每个数字所在的位数来计算应该乘10的几次幂(Math.pow()函数用于求幂),最后累加。
result += (chars[i] - '0') * Math.pow(10, chars.length - i - 1);
// 是否超出int的最小值
if (negative && -result < Integer.MIN_VALUE) {
throw new NumberFormatException("For input string:\"" + s + "\"");
}
// 是否超出int的最大值
if (!negative && result > Integer.MAX_VALUE) {
throw new NumberFormatException("For input string:\"" + s + "\"");
}
}
if (negative) result = -result;
return (int) result;
}
我怎么感觉我的代码实现要比JDK官方的更简洁更易懂呢^_^