【问题标题】:Convert from one base to another in JavaScript [duplicate]在JavaScript中从一个基础转换为另一个[重复]
【发布时间】:2018-10-01 08:34:35
【问题描述】:

在 JavaScript 中,是否有任何内置函数可以将整数从一个给定的基数转换为另一个给定的基数?我注意到已经可以使用toString(numberToConvertTo) 将十进制数转换为另一个基数,但我还没有找到可以从 any 基数转换为任何其他基数的通用函数,如图:

convertFrom(toConvert, baseToConvertFrom, baseToConvertTo){
    //convert the number from baseToConvertFrom to BaseToConvertTo
}

【问题讨论】:

  • 一种方法是编写一个函数,将数字从给定的基数转换为二进制数,如下所示:convertToBinary(numberToConvert, baseToConvertFrom)。该函数的输出可以作为内置函数toString(numberToConvertTo).的输入

标签: javascript base


【解决方案1】:

调用 parseInt(str, fromBase) 以转换为以 10 为底的数字(或者更确切地说,转换为实际数字),然后调用 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);哈哈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多