在JavaScript中将数字从一种进制转换为另一种。

3
在JavaScript中,是否有任何内置函数可以将一个整数从一个给定的进制转换为另一个给定的进制?我注意到已经可以使用toString(numberToConvertTo)将十进制数转换为另一种进制,但我还没有找到一个通用的函数,可以将从任何进制转换为另一种进制,如下所示:
convertFrom(toConvert, baseToConvertFrom, baseToConvertTo){
    //convert the number from baseToConvertFrom to BaseToConvertTo
}

其中一种方法是编写一个函数,将给定基数的数字转换为二进制,例如:convertToBinary(numberToConvert, baseToConvertFrom)。该函数的输出可用作内置函数toString(numberToConvertTo)的输入。 - Anderson Green
1
类似问题:https://dev59.com/MHM_5IYBdhLWcg3wiDuA - Anton Tarasenko
2个回答

9

调用parseInt(str, fromBase)将其转换为十进制(或实际数字),然后调用num.toString(toBase)


2

您可能需要定制输入或输出。您可能需要超过36个基数。因此,我制作了这个工具。

function baseCon(number,fromBase,toBase,fromChars,toChars) {
  if (!fromChars) {
    fromChars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    number = number.toString().toUpperCase();
  }
  if (!toChars) {
    toChars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
  }
  if (typeof number != 'object') {
    number = number.toString();
  }
  if (fromBase > fromChars.length) {
    console.log('fromBase was too high');
  } else if (toBase > toChars.length) {
    console.log('toBase was too high');
  } else {
    if (fromBase == 10) {
      var base10Num = Math.min(number);
    } else {
      var base10Num = 0;
      var place = 0;
      for (var index = number.length - 1; index > -1; index--) {
        base10Num = base10Num + (fromChars.indexOf(number[index]) * Math.pow(fromBase,place));
        place++;
      }
    }
    var string = '';
    var looping = true;
    var stringLen = 0;
    var stringVal = 0;
    while (looping) {
      stringLen++;
      if (Math.pow(toBase,stringLen) == base10Num) {
        stringLen++;
        break;
      } else if (Math.pow(toBase,stringLen) >= base10Num) {
        break;
      }
    }
    for (var placePos = stringLen; placePos > 0; placePos--) {
      for (var placeVal = 0; placeVal < (toBase + 1); placeVal++) {
        if (((placeVal * Math.pow(toBase,placePos - 1)) > (base10Num - stringVal)) || (placeVal == 0) && ((base10Num - stringVal) == 0)) {
          if (!((placeVal == 0) && ((base10Num - stringVal) == 0))) {
            stringVal = stringVal + ((placeVal - 1) * Math.pow(toBase,placePos - 1));
            string = string + toChars[placeVal - 1];
          } else {
            string = string + toChars[0];
          }
          break;
        }
      }
    }
    if (stringVal == base10Num) {
      return string;
    } else {
      console.log('baseCon failed');
      return string;
    }
  }
};

您可以自定义输入字符,这样您就可以做出像这样的事情。
> baseCon([true,true,false,true,false],2,10,[false,true]);
< "26"

当然还有输出字符。
> baseCon('3942',10,8,false,['!','@','#','$','%','^','&','*']);
< "*^%&"

我花了一整天的时间才想起来 parseInt(number,fromBase).toString(toBase); 哈哈


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接