将十六进制数字格式化为JavaScript中的UUID短

问题描述 投票:22回答:7

我在javascript中有一个十六进制数字。出于显示目的,我想将字符串格式化为:

ffffffff-ffff-ffff
00000000-0000-01ff

[(8 digits)-(4 digits)-(4 digits)前面有填充的零]

我一直在尝试编写自己的循环,以将任意十六进制数字格式化为这种格式,但这似乎已经可以在JavaScript中使用。

是否有内置的方法可以在JavaScript中格式化十六进制数字?

javascript formatting hex uuid
7个回答
54
投票
我将分两步进行:

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);


14
投票
进一步了解科纳伯的答案:

如果您的数字确实是完整的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"


11
投票

ES6版本

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

1
投票
我认为纯javascript中没有与此相关的任何东西,但是框架提供了这种方法,在ExtJS 3中,它是通过这种方式实现的

/** * 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; }


1
投票
最短的结论版本

对于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

1
投票
由于hexwab答案中所述的限制,我假设数字已经是字符串形式。如果不是,请使用适合您情况的任何机制将其放入任意长度的十六进制字符串(称为str)中,以开始该过程。然后:

function format(str) { return (1e15+str).slice(-16).match(/^.{8}|.{4}/g).join('-'); } console.log(format('723e9f4911'))

0
投票
String有两种方法,分别称为padStartpadEnd

const num = 15; console.log(num.toString(16).padStart(2, "0")); // "0f"

const num = 15;
console.log(num.toString(16).padEnd(2, "0")); // "f0"
链接上的其他信息:padStartpadEnd
© www.soinside.com 2019 - 2024. All rights reserved.