Luk*_*ith 1387 javascript hex base tostring number-formatting
如何在JavaScript中将十进制值转换为十六进制等效值?
Pre*_*aul 2337
使用以下代码将数字转换为十六进制字符串:
hexString = yourNumber.toString(16);
Run Code Online (Sandbox Code Playgroud)
并通过以下方式扭转过程:
yourNumber = parseInt(hexString, 16);
Run Code Online (Sandbox Code Playgroud)
Tod*_*Tod 134
如果需要处理位字段或32位颜色等内容,则需要处理带符号的数字.javascript函数toString(16)将返回一个负十六进制数,这通常不是你想要的.这个函数做了一些疯狂的补充,使它成为一个正数.
function decimalToHexString(number)
{
if (number < 0)
{
number = 0xFFFFFFFF + number + 1;
}
return number.toString(16).toUpperCase();
}
console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));Run Code Online (Sandbox Code Playgroud)
Luk*_*ith 78
下面的代码将十进制值d转换为十六进制.它还允许您向十六进制结果添加填充.因此默认情况下0将变为00.
function decimalToHex(d, padding) {
var hex = Number(d).toString(16);
padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;
while (hex.length < padding) {
hex = "0" + hex;
}
return hex;
}
Run Code Online (Sandbox Code Playgroud)
小智 61
function toHex(d) {
return ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}
Run Code Online (Sandbox Code Playgroud)
Fab*_*ari 35
填充:
function dec2hex(i) {
return (i+0x10000).toString(16).substr(-4).toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)
Alb*_*rto 35
完成后,如果您想要负数的二进制补码十六进制表示,则可以使用零填充右移位>>>运算符.例如:
> (-1).toString(16)
"-1"
> ((-2)>>>0).toString(16)
"fffffffe"
Run Code Online (Sandbox Code Playgroud)
但是有一个限制:javascript按位运算符将它们的操作数视为32位序列,也就是说,你得到32位二进制补码.
小智 18
没有循环:
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
Run Code Online (Sandbox Code Playgroud)
也不是最好不要使用必须评估的循环测试,例如,而不是:
for (var i = 0; i < hex.length; i++){}
Run Code Online (Sandbox Code Playgroud)
有
for (var i = 0, var j = hex.length; i < j; i++){}
Run Code Online (Sandbox Code Playgroud)
小智 17
将一些好的想法结合起来用于rgb到hex函数(在其他地方为html/css添加#):
function rgb2hex(r,g,b) {
if (g !== undefined)
return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1);
else
return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1);
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ing 13
接受的答案没有考虑单个数字返回的十六进制代码.这很容易调整:
function numHex(s)
{
var a = s.toString(16);
if ((a.length % 2) > 0) {
a = "0" + a;
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
和
function strHex(s)
{
var a = "";
for (var i=0; i<s.length; i++) {
a = a + numHex(s.charCodeAt(i));
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
我相信上述答案已被其他人以各种形式多次发布.我将它们包装在一个toHex()函数中,如下所示:
function toHex(s)
{
var re = new RegExp(/^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/);
if (re.test(s)) {
return '#' + strHex( s.toString());
}
else {
return 'A' + strHex(s);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,数字正则表达式来自10多个有用的JavaScript正则表达式函数,以提高您的Web应用程序效率.
更新:经过几次测试这个东西我发现一个错误(RegExp中的双引号)所以我修复了这个问题.然而!经过相当多的测试并阅读了almaz的帖子 - 我意识到我无法得到负数.进一步 - 我做了一些阅读,因为所有Javascript数字都存储为64位字,无论如何 - 我尝试修改numHex代码以获得64位字.但事实证明你不能这样做.如果将"3.14159265"AS A NUMBER放入变量中 - 您将能够得到的只是"3",因为小数部分只能通过重复乘以10(IE:10.0)来访问.或者换句话说 - 十六进制的十六进制值导致FLOATING POINT值在AND运算之前被转换为INTEGER,这将删除该时段背后的所有内容.而不是将值作为一个整体(即:3.14159265)并将FLOATING POINT值与0xf值进行AND运算.因此,在这种情况下,最好的做法是将3.14159265转换为STRING,然后转换字符串.由于上述原因,它也可以很容易地转换负数,因为减号在值的前面只变为0x26.所以我做的是确定变量包含一个数字 - 只需将其转换为字符串并转换字符串.这对每个人来说意味着在服务器端你需要取消传入的字符串,然后确定传入的信息是数字.您只需在数字前面添加"#",然后在返回的字符串前面添加"A"即可轻松完成.请参阅toHex()函数.
玩得开心!
经过一年多的思考,我认为"toHex"功能(我也有"fromHex"功能)确实需要进行改造.整个问题是"我怎样才能更有效地做到这一点?" 我决定一个to/from hex函数不应该关心某个东西是否是一个小数部分,但同时它应该确保小数部分包含在字符串中.那么问题就变成了,"你怎么知道你正在使用十六进制字符串?".答案很简单.使用世界各地已经识别的标准预字符串信息.换句话说 - 使用"0x".所以现在我的toHex函数看看是否已经存在,如果是 - 它只返回发送给它的字符串.否则,它会转换字符串,数字等等.这是修改后的toHex函数:
var l = "0123456789ABCDEF";
var o = "";
if (typeof s != "string") {
s = s.toString();
}
for (var i=0; i<s.length; i++) {
var c = s.charCodeAt(i);
o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1);
}
return "0x" + o;
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常快速的函数,它考虑单个数字,浮点数,甚至检查该人是否正在发送十六进制值再次被剔除.它只使用四个函数调用,其中只有两个在循环中.要取消使用您使用的值的十六进制:
/////////////////////////////////////////////////////////////////////////////
// fromHex(). Convert a hex string to ASCII text.
/////////////////////////////////////////////////////////////////////////////
fromHex(s)
{
var start = 0;
var o = "";
if (s.substr(0,2) == "0x") {
start = 2;
}
if (typeof s != "string") {
s = s.toString();
}
for (var i=start; i<s.length; i+=2) {
var c = s.substr(i, 2);
o = o + String.fromCharCode(parseInt(c, 16));
}
return o;
}
Run Code Online (Sandbox Code Playgroud)
与toHex()函数一样,fromHex()函数首先查找"0x",然后将传入的信息转换为字符串(如果它不是字符串).我不知道它不会是一个字符串 - 但以防万一 - 我检查.然后该函数通过,抓取两个字符并将其转换为ascii字符.如果您希望它翻译unicode,您需要将循环更改为一次四(4)个字符.但是你还需要确保字符串不能被四个除.如果是 - 那么它是标准的十六进制字符串.(记住字符串前面有"0x".)
一个简单的测试脚本显示-3.14159265,当转换为字符串时,仍然是-3.14159265.
<?php
echo <<<EOD
<html>
<head><title>Test</title>
<script>
var a = -3.14159265;
alert( "A = " + a );
var b = a.toString();
alert( "B = " + b );
</script>
</head>
<body>
</body>
</html>
EOD;
?>
Run Code Online (Sandbox Code Playgroud)
由于Javascript在toString()函数方面的工作原理,所有这些问题都可以在之前导致问题之前消除.现在可以轻松转换所有字符串和数字.此外,诸如对象之类的东西将导致Javascript本身产生错误.我相信这一切都和它一样好.剩下的唯一改进是W3C在Javascript中只包含一个toHex()和fromHex()函数.
小智 11
var number = 3200;
var hexString = number.toString(16);
Run Code Online (Sandbox Code Playgroud)
16是基数,十六进制数有16个值:-)
约束/填充到一定数量的字符:
function decimalToHex(decimal, chars) {
return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)
小智 8
function dec2hex(i)
{
var result = "0000";
if (i >= 0 && i <= 15) { result = "000" + i.toString(16); }
else if (i >= 16 && i <= 255) { result = "00" + i.toString(16); }
else if (i >= 256 && i <= 4095) { result = "0" + i.toString(16); }
else if (i >= 4096 && i <= 65535) { result = i.toString(16); }
return result
}
Run Code Online (Sandbox Code Playgroud)
如果你想将一个数字转换为RGBA颜色值的十六进制表示,我发现这是几个提示的最有用的组合,从这里:
function toHexString(n) {
if(n < 0) {
n = 0xFFFFFFFF + n + 1;
}
return "0x" + ("00000000" + n.toString(16).toUpperCase()).substr(-8);
}
Run Code Online (Sandbox Code Playgroud)
正如接受的答案所述,从十进制转换为十六进制的最简单方法是var hex = dec.toString(16)。但是,您可能更愿意添加字符串转换,因为它可以确保字符串表示形式"12".toString(16)正常工作。
// Avoids a hard-to-track-down bug by returning `c` instead of `12`
(+"12").toString(16);
Run Code Online (Sandbox Code Playgroud)
要反转该过程,您还可以使用下面的解决方案,因为它更短。
var dec = +("0x" + hex);
Run Code Online (Sandbox Code Playgroud)
它在 Google Chrome 和 Firefox 中似乎较慢,但在 Opera 中明显更快。请参阅http://jsperf.com/hex-to-dec。
对于任何感兴趣的人,这里有一个JSFiddle比较这个问题的大部分答案.
这是我最终的方法:
function decToHex(dec) {
return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}
Run Code Online (Sandbox Code Playgroud)
另外,请记住,如果您希望将CSS从十进制转换为十六进制以用作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 + ')')
Run Code Online (Sandbox Code Playgroud)
这将#some-elementCSS color属性设置为rgb(64, 62, 154).
好的,答案已经给出,这是免费的.这是一个精简的ES6版本:
const convert = {
bin2dec : s => parseInt(s, 2).toString(10),
bin2hex : s => parseInt(s, 2).toString(16),
dec2bin : s => parseInt(s, 10).toString(2),
dec2hex : s => parseInt(s, 10).toString(16),
hex2bin : s => parseInt(s, 16).toString(2),
hex2dec : s => parseInt(s, 16).toString(10)
};
convert.bin2dec('111'); // '7'
convert.dec2hex('42'); // '2a'
convert.hex2bin('f8'); // '11111000'
convert.dec2bin('22'); // '10110'
Run Code Online (Sandbox Code Playgroud)
小智 6
AFAIK 评论57807是错误的,应该是这样的: var hex = Number(d).toString(16); 而不是 var hex = parseInt(d,16);
function decimalToHex(d, padding) {
var hex = Number(d).toString(16);
padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;
while (hex.length < padding) {
hex = "0" + hex;
}
return hex;
}
Run Code Online (Sandbox Code Playgroud)
toString使用ES6 的简单解决方案,padStart用于将十六进制颜色数字转换为十六进制颜色字符串。
const string = `#${color.toString(16).padStart(6, '0')}`;
Run Code Online (Sandbox Code Playgroud)
例如:
0x000000将成为#000000
0xFFFFFF将成为#FFFFFF
小智 5
如果数字是负数?
这是我的版本.
function hexdec (hex_string) {
hex_string=((hex_string.charAt(1)!='X' && hex_string.charAt(1)!='x')?hex_string='0X'+hex_string : hex_string);
hex_string=(hex_string.charAt(2)<8 ? hex_string =hex_string-0x00000000 : hex_string=hex_string-0xFFFFFFFF-1);
return parseInt(hex_string, 10);
}
Run Code Online (Sandbox Code Playgroud)
我正在一个相当大的循环中转换为十六进制字符串,所以我尝试了几种技术以找到最快的一种。结果我的要求是有一个固定长度的字符串,并正确编码负值(-1 => ff..f)。
Simple.toString(16)对我不起作用,因为我需要正确编码负值。以下代码是迄今为止我在 1-2 字节值上测试过的最快的代码(请注意,它symbols定义了您想要获得的输出符号的数量,对于 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;
}
Run Code Online (Sandbox Code Playgroud)
它比.toString(16)在 1-2 字节的数字上执行得更快,在更大的数字上执行得更慢(当symbols>= 6 时),但仍应胜过正确编码负值的方法。
| 归档时间: |
|
| 查看次数: |
844590 次 |
| 最近记录: |