最近在刷scriptOJ上面的题目
遇到了将16进制颜色转换成rgb格式的题目特此记录一下:
const hexToRGB = hex => {
hex=hex+"";
hex = hex[0] === '#' ? hex.slice(1) : hex
hex = hex.length === 3 ?(hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]) : hex
console.log(hex);
let res="";
if ((hex.length !== 6) || !(/^[0-9a-fA-F]{6}$/.test(hex))) return null
res=parseInt(hex[0]+hex[1],16)+", "+parseInt(hex[2]+hex[3],16)+", "+parseInt(hex[4]+hex[5],16);
return `rgb(${res})`
}
console.log(hexToRGB('#7aE'));
输出结果:
注意点:
- 在做这种在线运行的题目时,往往测试用例比较多,所以要把所有情况考虑全,采坑如下
- 输入的hex可能不是一个字符串,所以要把它转换成字符串。尝试过不转换下面报错没法读取0,不懂为什么
- 要检查hex的长度是不是6,有可能输入#ffaaffa,正则检查是不是符合/^[0-9a-fA-F]{6}$/,因为有可能是#script
- 逗号后有空格,这点仔细检查一下就发现了,不过我有次笔试的时候也踩过坑,一般答案样子差不多基本上就是逗号是不是英文格式以及空格问题。
- 搜答案的时候看到一个人写str.repeat(2)这是es6新增的字符串方法,但是其实如果str是abc返回的是abcabc不是我们想要的aabbcc
- parseInt的第二个参数,今天是第一次用:注意如果第二个参数不写,默认是按十进制转换,通常情况下参数二的范围是:介于 2 ~ 36 之间。
下面贴上反转换的方式:
const RGBTohex=rgb=>{
rgb=rgb.slice(4,-1);
let rgb0=[];
let fir=rgb.indexOf(",");
let sec=rgb.lastIndexOf(",");
rgb0.push(parseInt(rgb.slice(0,fir)),parseInt(rgb.slice(fir+1,sec)),parseInt(rgb.slice(sec+1)));
console.log(parseInt(rgb.slice(sec+1)));
const [r,g,b]=rgb0;
let res=r.toString(16)+","+g.toString(16)+","+b.toString(16);
return `#${res}`
}
console.log(RGBTohex("rgb(119,170,238)"))
运行结果:
- 恰好用到了数字转为16进制。结合上一程序中的字符串转十六进制数。两个(目前我)不常用的知识点。
- 用到了es6解构赋值,比较简单