我在javascript中有一个十六进制数字。出于显示目的,我想将字符串格式化为:
ffffffff-ffff-ffff
00000000-0000-01ff
[(8 digits)-(4 digits)-(4 digits)
前面有填充的零]
我一直在尝试编写自己的循环,以将任意十六进制数字格式化为这种格式,但这似乎已经可以在JavaScript中使用。
是否有内置的方法可以在JavaScript中格式化十六进制数字?
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);
如果您的数字确实是完整的64位长,则应注意javascript仅加倍,精度最高达到53位。例如:
var i = 0x89abcdef01234567; // a 64-bit constant
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef01234800"
因此,您可能希望将其拆分为两个32位数字,然后一次将其格式化为8位数字。然后是第二个警告:javascript对signed 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"
ES6版本
function toPaddedHexString(num, len) {
str = num.toString(16);
return "0".repeat(len - str.length) + str;
}
var hexStr = toPaddedHexString(12345, 16);
/**
* 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;
}
对于ID,例如00000000-0000-01ff
这是亚当·莱格特答案的改写和缩写版本。
function createID_8_4_4(s)
{
return(1e16+s).slice(-16).replace(/^.{8}|.{4}(?!$)/g,'$&-')
/*
OR the version for easy understanding:
return(1e16+s).slice(-16).match(/..../g).join('-').replace('-','')
replace on the end replaces only first '-'
*/
}
console.log(createID_8_4_4('01ff')); //00000000-0000-01ff
对于ID,例如
0000-0000-0000-01ff
function createID_4_4_4_4(s)
{
return(1e16+s).slice(-16).match(/..../g).join('-')
}
console.log(createID_4_4_4_4('01ff')); //0000-0000-0000-01ff
str
)中,以开始该过程。然后: function format(str) {
return (1e15+str).slice(-16).match(/^.{8}|.{4}/g).join('-');
}
console.log(format('723e9f4911'))