在Javascript中格式化十六进制数

时间:2012-03-28 13:57:29

标签: javascript formatting hex

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

ffffffff-ffff-ffff
00000000-0000-01ff

(8位数) - (4位数) - (4位数)正面有填充的零

我一直在尝试编写自己的循环来将任意十六进制数格式化为这种格式,但这似乎应该在javascript中可用。是否有内置的方法来格式化javascript中的十六进制数字?

谢谢!

7 个答案:

答案 0 :(得分:47)

我会做两个步骤:

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

答案 1 :(得分:14)

进一步对knabar的回答:

如果您的数字实际上是一个完整的64位长,您应该知道javascript只有两倍,最高可达53位精度。 E.g。

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"

答案 2 :(得分:9)

ES6版本

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

var hexStr = toPaddedHexString(12345, 16);

答案 3 :(得分:2)

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

答案 4 :(得分:2)

结论最短的版本

对于00000000-0000-01ff这样的ID

这是亚当·莱格特答案的改写和缩写版本。

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

答案 5 :(得分: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;
    }

答案 6 :(得分:0)

由于hexwab的答案中描述的限制,我认为该数字已经是字符串形式。如果不是,请使用适合您情况的任何机制将其转换为任意长度的十六进制字符串(称为str),从而启动该过程。然后:

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