知食记
搜索文档…
实现parseInt
当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
只有字符串中的第一个数字会被返回。
留意以下测试用例
1
/ 以下例子均返回15:
2
console.log(_parseInt("F", 16));
3
console.log(_parseInt("17", 8));
4
console.log(_parseInt("15", 10));
5
console.log(_parseInt(15.99, 10));
6
console.log(_parseInt("FXX123", 16));
7
console.log(_parseInt("1111", 2));
8
console.log(_parseInt("15*3", 10));
9
console.log(_parseInt("12", 13));
10
11
// 以下例子均返回 NaN:
12
console.log(_parseInt("Hello", 8)); // Not a number at all
13
console.log(_parseInt("546", 2)); // Digits are not valid for binary representations
14
15
// 以下例子均返回 -15:
16
console.log(_parseInt("-F", 16));
17
console.log(_parseInt("-0F", 16));
18
console.log(_parseInt("-0XF", 16));
19
console.log(_parseInt(-15.1, 10));
20
console.log(_parseInt(" -17", 8));
21
console.log(_parseInt(" -15", 10));
22
console.log(_parseInt("-1111", 2));
23
console.log(_parseInt("-15e1", 10));
24
console.log(_parseInt("-12", 13));
25
// 下例中也全部返回 17,因为输入的 string 参数以 "0x" 开头时作为十六进制数字解释,而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。
26
console.log(_parseInt("0x11", 16));
27
console.log(_parseInt("0x11", 0));
28
console.log(_parseInt("0x11"));
29
30
// 下面的例子返回 224
31
console.log(_parseInt("0e0",16));
Copied!

完整实现

1
function _parseInt(string, radix) {
2
if (typeof string !== "string" && typeof string !== "number") return NaN;
3
if (
4
radix &&
5
(typeof radix !== "number" ||
6
/^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$/.test(radix) || // 识别小数
7
radix > 36 ||
8
radix < 2)
9
)
10
return NaN;
11
string = String(string);
12
var rexp =
13
radix === 10 ? /(-?)([0]?)([0-9]+)/ : /(-?)([0]?[Xx]?)([0-9a-fA-F]+)/,
14
a = string.match(rexp),
15
sign = a[1],
16
rawRadix = a[2],
17
rawNum = a[3],
18
result = 0,
19
strArr = rawNum.split(""), // 分割每个字符
20
len = strArr.length,
21
numArr = [];
22
if (a && !radix) {
23
if (rawRadix.toUpperCase() === "0X") {
24
radix = 16;
25
} else if (rawRadix === "0") {
26
radix = 8;
27
} else {
28
radix = 10;
29
}
30
}
31
for (var i = 0; i < len; i++) {
32
var num;
33
var charCode = strArr[i].toUpperCase().charCodeAt(0);
34
if (radix <= 36 && radix >= 11) {
35
if (charCode >= 65 && charCode <= 90) {
36
// a - z => 10 - 35
37
num = charCode - 55;
38
} else {
39
// 只会是数字了 -48 会转换为数字 0-9 => 48-57
40
num = charCode - 48;
41
}
42
} else {
43
num = charCode - 48;
44
}
45
if (num < radix) {
46
numArr.push(num);
47
} else {
48
return NaN;
49
}
50
}
51
if (numArr.length > 0) {
52
numArr.forEach(function(item, j) {
53
result += item * Math.pow(radix, numArr.length - j - 1);
54
});
55
}
56
if (sign === "-") {
57
result = -result;
58
}
59
return result;
60
}
61
Copied!

简单实现

1
function _parseInt(str, radix) {
2
let str_type = typeof str;
3
let res = 0;
4
if (str_type !== 'string' && str_type !== 'number') {
5
// 如果类型不是 string 或 number 类型返回NaN
6
return NaN
7
}
8
9
// 字符串处理
10
str = String(str).trim().split('.')[0]
11
let length = str.length;
12
if (!length) {
13
// 如果为空则返回 NaN
14
return NaN
15
}
16
17
if (!radix) {
18
// 如果 radix 为0 null undefined
19
// 则转化为 10
20
radix = 10;
21
}
22
if (typeof radix !== 'number' || radix < 2 || radix > 36) {
23
return NaN
24
}
25
26
for (let i = 0; i < length; i++) {
27
let arr = str.split('').reverse().join('');
28
res += Math.floor(arr[i]) * Math.pow(radix, i)
29
}
30
31
return res;
32
}
Copied!
剔除其他判断的最核心实现
1
function _parseInt(str, radix) {
2
const intStr = String(str).trim().split('.')[0]
3
// 翻转字符
4
const intStrR = intStr.split('').reverse().join('');
5
for (let i = 0; i < intStr.length; i++) {
6
res += Math.floor(intStrRr[i]) * Math.pow(radix, i)
7
}
8
9
return res;
10
}
Copied!
复制链接