在JavaScript中将十六进制数字格式化为短UUID
Formatting hexadecimal Number to short UUID in JavaScript
我在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);
进一步了解knabar的答案:
如果你的数字真的是一个完整的64位长,你应该知道javascript只有两倍的精度,最高可达53位左右。例如
var i = 0x89abcdef01234567; // a 64-bit constant
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef01234800"
因此,您可能希望将其拆分为两个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"
ES6版本
function toPaddedHexString(num, len) {
str = num.toString(16);
return "0".repeat(len - str.length) + str;
}
var hexStr = toPaddedHexString(12345, 16);
String
有两种方法,称为padStart
和padEnd
const num = 15;
console.log(num.toString(16).padStart(2, "0")); // "0f"
const num = 15;
console.log(num.toString(16).padEnd(2, "0")); // "f0"
有关链接的其他信息:padStart,padEnd
作为结论的最短版本
对于像00000000-0000-01ff
这样的ID
这是Adam Leggett答案的改写和缩写版本
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
对于像0000-0000-0000-01ff
这样的ID
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
我不认为在纯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;
}
由于hexwab的答案中描述的限制,我假设数字已经是字符串的形式。如果不是,请使用适合您的情况的任何机制将其转换为任意长度的十六进制字符串(称为str
),以此开始该过程。然后:
function format(str) {
return (1e15+str).slice(-16).match(/^.{8}|.{4}/g).join('-');
}
console.log(format('723e9f4911'))
- jQuery中是否内置了任何字符串格式化函数
- 将字符串转换为格式化日期
- Highcharts-如何在自定义格式化程序中获得默认的y轴标签格式化程序
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- 在HTML画布上格式化文本
- 用于高级文本的格式化工具
- 使用模式格式化Number类型输入中的值
- 将格式化的纯文本转换为HTML
- 如何配置WebStorm以正确格式化生成器函数
- 如何将日期字符串视为格式化数组[EYEAR,MONTH,DAY]
- 如何在谷歌可视化中组合数字和模式格式化程序
- 自定义验证并格式化从数据数据库返回的响应-BEGINNER
- 格式化获取请求的路由
- 如何将日期拆分为格式化的日期和时间
- 用于用户内容的简单代码编辑器/文本格式化程序(在Rails中)
- 格式化货币无效
- 格式化Ember/drill-down/serialize/adapter的JSON项目
- 使用纯javascript格式化数字
- 从Parse.com返回的格式化日期
- 如何用javascript格式化日期