首页 > 试题广场 >

颜色字符串转换

[编程题]颜色字符串转换
  • 热度指数:32021 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
示例1

输入

'rgb(255, 255, 255)'

输出

#ffffff
// slice function rgb2hex(sRGB) {
    if(sRGB.slice(0,4)!=='rgb(' || sRGB.slice(-1)!==')') return sRGB;     var rgb = sRGB.slice(4,-1).split(',');     if(rgb.length<3) return sRGB;     var rs='#';     var num;     for(var i=0;i<3;i++){         if(isNaN((num=parseInt(rgb[i])))) return sRGB;         if(num>255 || num<0) return  sRGB;         rs+=num.toString(16).length===1?'0'+num.toString(16):num.toString(16);     }     return rs; }
编辑于 2017-10-19 12:57:23 回复(0)
function rgb2hex(sRGB) {
    let res = '#';
    let reg = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/;
    if (reg.test(sRGB)) {
        let n1 = RegExp.$1, n2 = RegExp.$2, n3 = RegExp.$3;
        if(n1 < 0 || n1 > 255 || n2 < 0 || n2 > 255 || n3 < 0 || n3 > 255) res = sRGB;
        else {
            n1 = parseInt(n1, 10).toString(16);
            n2 = parseInt(n2, 10).toString(16);
            n3 = parseInt(n3, 10).toString(16);
            n1 = (n1.length == 1) ? ('0' + n1) : n1;
            n2 = (n2.length == 1) ? ('0' + n2) : n2;
            n3 = (n3.length == 1) ? ('0' + n3) : n3;
            res += (n1 + n2 + n3);
        }   
    }
    else {
        res = sRGB;
    }
    return res;
}

发表于 2019-10-22 10:24:29 回复(0)
function rgb2hex(sRGB) {
    var strFormat=function (str,num) {
        str=(+str).toString(16);
        str=str.length<2?str+str:str;
        return str;
    };
    sRGB=sRGB.replace(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/g,function (str,s1,s2,s3) {
        return "#"+strFormat(s1,16)+strFormat(s2,16)+strFormat(s3,16);
    });
    return sRGB;
}

发表于 2016-08-09 20:02:46 回复(0)
function rgb2hex(sRGB) {
    var hex = '#';
    if(!/rgb\(\d+,\s*\d+,\s*\d+\)/.test(sRGB)){return sRGB;}
    sRGB.replace(/\d+/g,function(a){
        hex += a<16?'0'+Number(a).toString(16):Number(a).toString(16);
    })
    return hex;
}

发表于 2016-04-18 22:44:18 回复(0)
function rgb2hex(sRGB) {
  const rgbReg = /rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)/
  if (rgbReg.test(sRGB)) {
    let rgbArray = [RegExp.$1, RegExp.$2, RegExp.$3]

    // 判断是否超过255,只要有一个不满足要求就直接返回原字符串
    const inCorrectRGB = rgbArray.some((rgbNum) => rgbNum > 255 || rgbNum < 0)
    if (inCorrectRGB) return sRGB
    // 转16进制
    let ret = rgbArray
      .map((rgb) => parseInt(rgb))
      .map((rgb) => {
        let hex = rgb.toString(16)
        hex = hex.length < 2 ? '0' + hex : hex
        return hex
      })
      .join('')

    return `#${ret}`
  }
  return sRGB
}

发表于 2021-08-18 00:15:39 回复(0)
function rgb2hex(sRGB) {
    if (!/^rgb\((\d{1,3},\s*){2}\d{1,3}\)$/.test(sRGB)) return sRGB;
    let  color = '#';
    sRGB.replace(/\d+/g, n => color += ('0' + (+n).toString(16)).slice(-2));
    return color;
}
编辑于 2021-07-28 16:24:41 回复(0)

使用eval,定义一个rgb function:

function rgb2hex(sRGB) {
    try{
        return eval(sRGB)
    }
    catch(err){
        return sRGB
    }
}
function rgb(r,g,b){
    let rH=r.toString(16)
    let gH=g.toString(16)
    let bH=b.toString(16)
    rH=rH.length==1?'0'+rH:rH
    gH=gH.length==1?'0'+gH:gH
    bH=bH.length==1?'0'+bH:bH
    return "#"+rH+gH+bH
}
发表于 2021-05-30 21:24:43 回复(0)
思路:
1. 判断格式是否达标
2. 将3个数字,利用正则提取生成一个数组
3. toString(16) 转换16进制
4. 拼接 加0 留2位处理
function rgb2hex(sRGB) {
    if(!/\((\s*(\d+)\s*\,){2}\s*(\d+)\s*\)/.test(sRGB)) return sRGB;
    let str = "#"; 
    sRGB.match(/([0-9]+)/g).map(i=>parseInt(i)).filter(i=>i>-1&&i<256).forEach(item => {
        str += ("0"+item.toString(16)).slice(-2);
    });
    return str;
}


编辑于 2020-12-29 21:53:00 回复(0)

神奇的是,正则用/^(rgb|RGB)/也是可以的

function rgb2hex(sRGB) {
    let req = /^(rgb|RGB)\((\d+,\s*){2}(\d+)\)$/;
    if(!req.test(sRGB)) return sRGB;
    let arr = sRGB.replace(/(rgb|RGB|\(|\))/g, '').split(',');
    let hex = '#';
    for(let i=0; i<arr.length; i++) {
        hex += ('0' + parseInt(arr[i]).toString(16)).slice(-2);
    }
    return hex;
}
发表于 2020-04-29 02:26:13 回复(0)
function rgb2hex(sRGB) {
    let reg=/rgb\(\s*(\d+),\s*(\d+),\s*(\d+)\)/g;
    let str='#';
    if(!reg.test(sRGB)){return sRGB;}
    return sRGB.replace(reg,function(a,o,t,s){
        for(let i=1;i<=3;i++){
            if(0<=arguments[i]&&arguments[i]<=255){
                  str+=arguments[i]<16?'0'+arguments[i]:(+arguments[i]).toString(16);
            }else{
                return sRGB;
            }
        }
        return str;
    });
}

发表于 2019-11-12 22:49:44 回复(0)
function rgb2hex(sRGB) {
    var str = '';
    var num = 0;
    var temp = new RegExp(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
    var result = temp.test(sRGB);
    if(result){
        sRGB.replace(/(\d+)/g, function(a,b){
             num = Number(b)>16 ?  Number(b).toString(16): '0'+ Number(b).toString(16);
            str = str + num;
        })
      return '#' + str;  
    }else{
        return sRGB;
    }
}
发表于 2019-09-15 11:47:52 回复(0)

发表于 2019-06-17 16:26:08 回复(1)
function rgb2hex(sRGB) {
  if(!/^rgb\(((\d|[1-9]\d|1\d{2}|2[0-5]{2})\, *){2}(\d|[1-9]\d|1\d{2}|2[0-5]{2})\)$/.test(sRGB)) return sRGB;
  return '#' + sRGB.match(/\d+/g).map(function(cur) {
    var temp = Number(cur).toString(16);
    if(temp.length === 1) temp = '0' + temp;
    return temp;
  }).join('');
}
发表于 2018-05-03 15:08:26 回复(0)
function rgb2hex(sRGB) {
    var reg=/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/;
    var cast = function(n) {
        var n = parseInt(n);
        return ( n < 16 ? '0' : '' ) + (n.toString(16)) ;
    }
    if(reg.test(sRGB)){
        var numlist=reg.exec(sRGB);
        var result='';
        for(var i=1;i<numlist.length;i++){
            result+=cast(numlist[i]);
        }
        return '#'+result;
    }else{
        return sRGB;
    }
}

发表于 2016-03-08 17:16:44 回复(1)
function rgb2hex(sRGB) {
   return sRGB.replace(/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/g, function(a, r, g, b){
       return '#' + hex(r) + hex(g) + hex(b);
   }); 
}
function hex(n){
    return n < 16 ? '0' + (+n).toString(16) : (+n).toString(16);
}
发表于 2015-09-29 22:20:00 回复(14)
function rgb2hex(sRGB) {
    var regexp=/rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
    var ret=sRGB.match(regexp);
    if(!ret){
        return sRGB;
    }else{
        var str='#';
        for(var i=1;i<=3;i++){
            var m=parseInt(ret[i]);
            if(m<=255&&m>=0){
                str+=(m<16?'0'+m.toString(16):m.toString(16));
            }else{
                return sRGB;
            }
        }
        return str;
    }
}

发表于 2015-09-04 12:01:05 回复(6)
考的知识点两个:
1. 正则表达式匹配;
2. toString(16)转换进制;

做的过程中注意:
1. 数值超界(0-255)
2. 不足两位补零
发表于 2019-01-07 10:03:07 回复(0)
//方式1:行数最少

function rgb2hex(sRGB) {
    return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
        return '#'+('0'+(+$1).toString(16)).slice(-2)+('0'+(+$2).toString(16)).slice(-2)+('0'+(+$3).toString(16)).slice(-2);
    });
}

//方式2:行数较少,代码较少,容易理解

function rgb2hex(sRGB) {
    return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
        return '#'+toHex($1)+toHex($2)+toHex($3);
    });
}
function toHex(str){
    return ('0'+(+str).toString(16)).slice(-2);
}

//方式3:行数较少,代码最少,容易理解?  //
function rgb2hex(sRGB){
    var result=['#'];
    if(!/rgb\(\d+(,\s*\d+){2}\)/.test(sRGB)){
        return sRGB;
    }
    sRGB.replace(/\d+/g,function($0){
        result.push(('0'+(+$0).toString(16)).slice(-2));
    });
    return result.join('');
}

编辑于 2016-08-27 20:34:26 回复(5)
分享一个用移位来算 rgb 的方法。
function rgb2hex(sRGB) {
	return sRGB.replace(/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/g, function(str, r, g, b){
    	return '#' + 
            ('00000' + (r << 16 | g << 8 | b).toString(16)).slice(-6);
   	});
}

编辑于 2017-08-21 13:47:45 回复(3)
  1. 先找到左、右括号的位置
  2. 如果右括号没有找到,就返回原字符串
  3. 获得结果,分割源字符串并得到数组、数组项转换为16进制,这里特别说一下,因为不能使用padStart方法,所以使用三元判断的方式处理结果是否需要补位
  4. 返回结果,数组转换为字符串,首位添加#符号
        function rgb2hex(sRGB) {
            // 填写JavaScript
            let branketLeft = sRGB.indexOf('(') + 1
            let branketRight = sRGB.indexOf(')')
            if (branketRight < 0) return sRGB

            let result = sRGB.slice(branketLeft, branketRight).split(',').map(item => (+item).toString(16).length !== 2 ? '0' + (+item).toString(16) : (+item).toString(16))


            return '#' + result.join('')
        }
发表于 2023-09-17 11:26:25 回复(0)