2013-01-21 45 views
3

在JavaScript中,是否有任何內置函數用於將一個給定基數的整數轉換爲另一個給定的基數?我注意到,它已經可以將十進制數轉換爲使用toString(numberToConvertTo)另一個基地,但我還沒有找到一個通用的功能,可以從任何基地轉換爲其他任何基礎,如圖所示:在JavaScript中從一個基地轉換爲另一個基地

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

一種方法是編寫一個函數,將轉換一個數字從給定的基礎到二進制,如下所示:'convertToBinary(numberToConvert,baseToConvertFrom)'。該函數的輸出可以用作內置函數'toString(numberToConvertTo)的輸入。「# –

回答

9

撥打電話parseInt(str, fromBase)轉換爲10(或更確切地說,實際的號碼),然後撥打num.toString(toBase)

+1

JSFiddle上的演示:http://jsfiddle.net/jarble/p9ZLa/ –

1

您可能想要自定義您的輸入或輸出。你可能需要超過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);哈哈