我正在进行在线测试,它要求我编写基本的javascript代码。
它要求我解析一个数字字符串并将其转换为一个不同的基数。如果由于某种原因无法完成转换,它需要我返回-1。
我写了这个:
function convert(strNumber, radix) {
var result = parseInt(strNumber, radix);
if(isNaN(result))
{return -1;}
return result;
}
然后它通过各种测试运行我的代码并且全部通过。除了一个。
显然convert("ASD", 15)
根据测试应该是无效的,并且它期望它为-1。
但Javascript很高兴将其转换为10号
我尝试了各种各样的事情,例如添加try {} catch {}块和其他东西,但javascript从不抱怨将“ASD”转换为base 15。
测试是错误的,还是parseInt
错了?
顺便说一句,strNumber可以是36以下的任何基数。 例如:
convert("Z", 36) is 35
答案 0 :(得分:1)
parseInt
表现正常,并且将字母A
转换为基数15中的10(类似于十六进制如何使用A
作为数字10)。由于S
接受此类格式错误的输入,D
和parseInt
将被丢弃。
如果
parseInt
遇到的字符不是指定基数中的数字,它会忽略它和所有后续字符,并返回解析到该点的整数值。
答案 1 :(得分:1)
根据官方documentation,parseInt
功能的行为如下
对于10以上的基数,字母表中的字母表示数字 例如,对于十六进制数字(基数16),A 通过F使用。
和
如果parseInt遇到的字符不是数字 指定的基数,它忽略它和所有后续字符和 返回解析到该点的整数值。
因此,为防止无效参数被解析,必须首先验证它们
function convert(strNumber, radix) {
if (isValidRadix(radix) && isValidInteger(strNumber, radix))
return parseInt(strNumber, radix);
return -1;
}
function isValidInteger(str, radix) {
var letters = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'].slice(0,radix);
str = str.toUpperCase();
for (var i=0; i<str.length; i++) {
var s = str.charAt(i);
if (letters.indexOf(s) == -1) return false;
}
return true;
}
function isValidRadix(radix) {
// 16 up to HEX system
return radix > 0 && radix <= 16;
}
console.log(convert("ASD", 15));
console.log(parseInt("ASD", 15));
console.log(convert("AAA", 15));
&#13;
答案 2 :(得分:1)
正如我在评论中所述,parseInt将转换到失败的程度。所以“A”在该基数中是有效的而“S”不是。所以你需要添加支票。
var nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".substr(0, radix)
var re = new RegExp("^[" + nums + "]+$","i")
if (!re.test(strNumber)) {
return -1
}