返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN。
注意:radix 参数为 n 将会把第一个参数看作是一个数的 n 进制表示,而返回的值则是十进制的。例如:
parseInt('123',5)// 将'123'看作5进制数,返回十进制数38 => 3*5^0 + 2*5^1 + 1*5^2 = 38以下 2 进制没有问题
function_parseInt(str,radix){letstr_type=typeofstr;letres=0;if(str_type!=='string'&&str_type!=='number'){// 如果类型不是 string 或 number 类型返回NaNreturnNaN}// 字符串处理str=String(str).trim().split('.')[0]letlength=str.length;if(!length){// 如果为空则返回 NaNreturnNaN}if(!radix){// 如果 radix 为0 null undefined// 则转化为 10radix=10;}if(typeofradix!=='number'||radix<2||radix>36){returnNaN}for(leti=0;i<length;i++){letarr=str.split('').reverse().join('');res+=Math.floor(arr[i])*Math.pow(radix,i)}returnres;}考虑 16 进制,完整版如下
const_parseInt=(str,radix)=>{// 不为string类型先转化为string 类型if(typeofstr!=='string')str=String(str)// 删除首尾空白str=str.trim()// 正则匹配[+|-]?[0]?[Xx]?[0-9a-fA-F]+constregex=/^(?<fuhao>[\+|\-]*)(?<radix>[0]?[Xx]?)(?<num>[0-9a-fA-F]+)/// 无法匹配返回NaNif(!regex.test(str))returnNaN// 匹配出符号、进制、数字三个分组constgroups=str.match(regex).groups// radix的有效范围为 2-36if(radix&&(radix<2||radix>36))returnNaN// 如果没有指定radix, radix 会有以下默认值if(!radix){if(groups.radix.toUpperCase()==='0X')radix=16elseif(groups.radix==='0')radix=8elseradix=10}// 挨个字符串解析,如果遇到无法解析时则停止解析,返回已经解析好的整数letsplitArr=groups.num.split('')constarr=[]for(leti=0;i<splitArr.length;i++){// 根据charCode来做转行为实际数据, 0-9为[48-57],A-F为[65-70]constcharCode=splitArr[i].toUpperCase().charCodeAt()letnum// 字符为[A-F]时, 实际数字为charCode -55if(charCode>=65)num=charCode-55// 字符为[0-9]时, 实际数字为charCode - 48elsenum=charCode-48// 当实际数字大于radix时, 无法解析则停止字符串遍历if(num>radix){break}else{arr.push(num)}}constlen=arr.length// 当实际数字数组长度为0时, 返回NaNif(!len)returnNaNletresult=0// 依次解析实际数字数组, 组合成真正的数字for(leti=0;i<len;i++){constnum=arr[i]*Math.pow(radix,len-i-1)result+=num}// 算法匹配到的正负号returnresult*(groups.fuhao==='-' ? -1 : 1)}
返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回
NaN。注意:
radix参数为n将会把第一个参数看作是一个数的n进制表示,而返回的值则是十进制的。例如:以下 2 进制没有问题
考虑 16 进制,完整版如下