2012-03-28 38 views
16

我在javascript中使用了十六進制數字。對於顯示的目的,我想格式化字符串:使用Javascript格式化十六進制數字

ffffffff-ffff-ffff 
00000000-0000-01ff 

(8位數字) - (4位) - (4位)與填零正面

我一直在努力寫我自己的循環來格式化一個任意的十六進制數字到這種格式,但這似乎是應該在JavaScript中可用的東西了。有一種內置的方式來格式化javascript中的十六進制數字嗎?

謝謝!

+0

不幸的是沒有辦法在JavaScript等格式十六進制數。但看看[這個鏈接](http://josscrowcroft.github.com/accounting.js/),也許它有幫助。 – Neq 2012-03-28 14:05:22

回答

43

我會做兩個步驟:

1)轉換數爲16位的十六進制帶前導零:

var i = 12345; // your number 
var h = ("000000000000000" + i.toString(16)).substr(-16); 

2)添加破折號

var result = h.substr(0, 8)+'-'+h.substr(8,4)+'-'+h.substr(12,4); 
+0

+1工程很好:http://jsfiddle.net/jmKYB/ – mellamokb 2012-03-28 14:08:04

0

我不認爲這是在純JavaScript相關的東西,但框架提供這種方法,在ExtJS的三是這種方式實現

/** 
    * Pads the left side of a string with a specified character. This is especially useful 
    * for normalizing number and date strings. Example usage: 
    * <pre><code> 
var s = String.leftPad('123', 5, '0'); 
// s now contains the string: '00123' 
    * </code></pre> 
    * @param {String} string The original string 
    * @param {Number} size The total length of the output string 
    * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ") 
    * @return {String} The padded string 
    * @static 
    */ 
    leftPad : function (val, size, ch) { 
     var result = String(val); 
     if(!ch) { 
      ch = " "; 
     } 
     while (result.length < size) { 
      result = ch + result; 
     } 
     return result; 
    } 
+0

這只是一個填充函數,那麼十六進制格式和破折號呢? – maerics 2012-03-28 14:06:29

12

繼knabar的回答是:

如果您的號碼確實是一個完整的64位長,你應該知道,JavaScript的只是雙打,其中排在前列的精度大約53位。例如。

var i = 0x89abcdef; // a 64-bit constant 
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef" 

所以你可能想把它分成兩個32位數字,並一次格式化8位數字。然後第二個警告罷工:JavaScript執行按位操作簽名 32位整數,並且此格式代碼無法處理負數。

var i = 0xffd2 << 16; // actually negative 
var h = ("0000000" + i.toString(16)).substr(-8); // "0-2e0000" 

因爲它是相當可能要在十六進制格式的數字是按位操作的結果,該代碼可以調整在補打印,而不是:

var i = 0xffd2 << 16; // actually negative 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffd20000" 

由此產生的十六進制表示任意正數和負數的整數部分的最低32位。這可能是你想要的(大約是printf("%08x"))。一些更多的角落案例:

var i = 1.5; // non-integers are rounded 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000001" 

var i = -1.5; // rounding is towards zero 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffffffff" 

var i = NaN; // not actually a number 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000000" 
0

由於hexwab的答案中描述的限制,我假設該數字已經是一個字符串的形式。如果不是,則使用任何適合您情況的機制,將其轉換爲任意長度的十六進制字符串(稱爲str)以啓動該進程。然後:

(Array(16).join(0) + str).slice(-16).replace(/^.{8}|.{4}(?!$)/g,"$&-"); 
6

ES6版本

function toPaddedHexString(num, len) { 
    str = num.toString(16); 
    return "0".repeat(len - str.length) + str; 
} 

var hexStr = toPaddedHexString(12345, 16);