使用parseInt和基数使用javascript解析整数

时间:2017-04-27 16:08:16

标签: javascript

我正在进行在线测试,它要求我编写基本的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

3 个答案:

答案 0 :(得分:1)

parseInt表现正常,并且将字母A转换为基数15中的10(类似于十六进制如何使用A作为数字10)。由于S接受此类格式错误的输入,DparseInt将被丢弃。

来自the parseInt documentation

  

如果parseInt遇到的字符不是指定基数中的数字,它会忽略它和所有后续字符,并返回解析到该点的整数值。

答案 1 :(得分:1)

根据官方documentationparseInt功能的行为如下

  

对于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;
&#13;
&#13;

答案 2 :(得分:1)

正如我在评论中所述,parseInt将转换到失败的程度。所以“A”在该基数中是有效的而“S”不是。所以你需要添加支票。

var nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".substr(0, radix)
var re = new RegExp("^[" + nums + "]+$","i")
if (!re.test(strNumber)) {
   return -1
}