如何在JavaScript中将十进制值转换为十六进制值?


当前回答

对于任何感兴趣的人,这里有一个JSFiddle比较了这个问题的大多数答案。

下面是我最终采用的方法:

function decToHex(dec) {
  return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}

此外,请记住,如果您希望将十进制转换为十六进制,以便在CSS中用作颜色数据类型,那么您可能更喜欢从十进制中提取RGB值并使用RGB()。

例如(JSFiddle):

let c = 4210330 // your color in decimal format
let rgb = [(c & 0xff0000) >> 16,  (c & 0x00ff00) >> 8,  (c & 0x0000ff)]

// Vanilla JS:
document..getElementById('some-element').style.color = 'rgb(' + rgb + ')'
// jQuery:
$('#some-element').css('color', 'rgb(' + rgb + ')')

这将#some元素的CSS颜色属性设置为rgb(64、62、154)。

其他回答

如果您需要处理位字段或32位颜色之类的事情,那么您需要处理带符号的数字。JavaScript函数toString(16)将返回一个负十六进制数,这通常不是您想要的。这个函数做了一些疯狂的加法,使其成为正数。

函数decimalToHexString(数字){如果(数字<0){number=0xFFFFFFFF+number+1;}return number.toString(16).toUpperCase();}console.log(decimalToHexString(27));console.log(decimalToHexString(48.6));

没有循环:

function decimalToHex(d) {
  var hex = Number(d).toString(16);
  hex = "000000".substr(0, 6 - hex.length) + hex;
  return hex;
}

// Or "#000000".substr(0, 7 - hex.length) + hex;
// Or whatever
// *Thanks to MSDN

另外,不使用必须评估的循环测试不是更好吗?

例如,代替:

for (var i = 0; i < hex.length; i++){}

have

for (var i = 0, var j = hex.length; i < j; i++){}

您可以在ECMAScript 6中执行以下操作:

const toHex = num => (num).toString(16).toUpperCase();

我正在一个相当大的循环中转换为十六进制字符串,所以我尝试了几种技术以找到最快的方法。我的要求是得到一个固定长度的字符串,并正确编码负值(-1=>ff..f)。

Simple.toString(16)不适合我,因为我需要正确编码负值。以下代码是迄今为止我在1-2字节值上测试的最快的代码(请注意,符号定义了要获得的输出符号的数量,即对于4字节整数,它应该等于8):

var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function getHexRepresentation(num, symbols) {
    var result = '';
    while (symbols--) {
        result = hex[num & 0xF] + result;
        num >>= 4;
    }
    return result;
}

它在1-2字节的数字上比.toString(16)执行得更快,在更大的数字上(当符号>=6时)执行得更慢,但仍应优于正确编码负值的方法。

var number = 3200;
var hexString = number.toString(16);

16是基数,十六进制数中有16个值:-)