C#实现3个整数转RGB十六进制字符串时单字符Hex值处理错误如何解决
问题根因
- 你的代码核心问题是单数字的十六进制值没有补前导0凑够2位,
Convert.ToString(int value, 16)对于0~15的输入只会返回长度为1的字符串,你在替换初始的000000时,短字符串只能覆盖对应位置的第一个字符,第二个字符还是残留的初始0,就会出现你遇到的12转成C而不是0C,最终结果错位的问题。 - 额外说明:
ReplaceAt不是C#字符串的内置方法,你的代码如果要在标准C#环境运行,还要依赖你自己实现的扩展方法,兼容性不好。
修复方案
有两种简洁的改法,不需要手动做字符串替换:
方案1:格式化字符串补前导0(最常用)
直接用格式说明符X2,表示将数字转为大写十六进制,固定占2位,不足自动补前导0:
public static string Rgb(int r, int g, int b) { r = Math.Clamp(r, 0, 255); g = Math.Clamp(g, 0, 255); b = Math.Clamp(b, 0, 255); return $"{r:X2}{g:X2}{b:X2}"; }
这个写法不需要做任何字符串拼接替换,直接插值格式化就能得到正确结果,性能和可读性都比你原来的实现好。
方案2:手动补前导0
如果你确实需要保留手动转换的逻辑,可以在拿到Convert.ToString的结果后,用PadLeft补前导0到固定2位:
public static string Rgb(int r, int g, int b) { r = Math.Clamp(r, 0, 255); g = Math.Clamp(g, 0, 255); b = Math.Clamp(b, 0, 255); string hexR = Convert.ToString(r, 16).PadLeft(2, '0'); string hexG = Convert.ToString(g, 16).PadLeft(2, '0'); string hexB = Convert.ToString(b, 16).PadLeft(2, '0'); return (hexR + hexG + hexB).ToUpper(); }
内容的提问来源于stack exchange,提问作者user16602651
相关产品推荐
相关产品推荐

