2014-02-10 177 views
1

這個問題比第一次看起來更復雜 - 雖然在概念上仍然相當簡單。Javascript - 十進制字符串的十六進制字符串

我代表大的數字,這是外部的JavaScript的最大範圍的,如字符串的十六進制數字(這是按照節點MySQL的bigNumberStrings選項的方法)。

我只是想知道我怎麼可以轉換的十六進制數字爲串的相同數值的小數位數?顯然,這樣做的複雜性是由於你無法用大量的javascript來進行數學運算。

我已經做了大量的搜索標準解決方案,雖然我還沒有找到。

+0

有一堆[JS的BigInteger庫](http://www.joseprio.com/blog/2013/04/27/biginteger-libraries-for-js/)。 – RobG

回答

1

算法本身是很簡單的,所以沒有必要對特殊的圖書館,它確實如此你會在紙上做什麼,所以它不是太低效。

function hexToDec(s) { 
    var i, j, digits = [0], carry; 
    for (i = 0; i < s.length; i += 1) { 
     carry = parseInt(s.charAt(i), 16); 
     for (j = 0; j < digits.length; j += 1) { 
      digits[j] = digits[j] * 16 + carry; 
      carry = digits[j]/10 | 0; 
      digits[j] %= 10; 
     } 
     while (carry > 0) { 
      digits.push(carry % 10); 
      carry = carry/10 | 0; 
     } 
    } 
    return digits.reverse().join(''); 
} 

工作原理:基本讀取十六進制數字並將它們添加到目前爲止計算出的dec值的中間數組。每個新的十六進制數字表示十進制數字的數組乘以16,並且所有的進位被分配給較高的數字。 while循環將其作爲數組中的新數字添加任何附加結轉。最後一行是將十進制數字數組轉換爲一個字符串。

更新:當然,您可以通過任何其他10的冪(100,1000,10000,100000,...)替換數字10來使算法更高效,並且它的工作原理也是一樣的。唯一要求中間值不超過尾數精度(52位)。

+0

這很漂亮 –

1

你可以使用一個標準庫像bignumber.js

的Javascript

var hex = 'ABCDEF1234567890', 
    bignumber = new BigNumber(hex, 16); 

console.log(bignumber.toString(10)); 

輸出

12379813812177893520 

jsFiddle