字符串格式化之十六进制格式化

44

使用下面的代码,colorstring 总是返回 #DDDD。如何修复这个问题?绿色、红色和空格值怎么办?

string colorstring;
int Blue = 13;
int Green = 0;
int Red = 0;
int Space = 14;
colorstring = String.Format("#{0:X}{0:X}{0:X}{0:X}", Blue, Green, Red, Space);

6
RGB十六进制颜色代码不应该是“红、绿、蓝”吗? - mellamokb
2
@mellamokb 可能会有不同的字节顺序。 - Joel Day
6个回答

71
数字0{0:X}中代表参数列表中的位置。在这种情况下,0表示使用第一个值,即Blue。对于第二个参数(Green),请使用{1:X},以此类推。
colorstring = String.Format("#{0:X}{1:X}{2:X}{3:X}", Blue, Green, Red, Space);

关于 format 参数的语法,请参考文档

格式项语法

每个格式项采用以下形式,由以下组成部分组成:

{ index[,alignment][:formatString]}

大括号 ("{" 和 "}") 是必需的。

索引组件

必需的索引组件,也称为参数说明符,是从0开始的数字,用于标识对象列表中相应项。也就是说,参数说明符为0的格式项格式化列表中的第一个对象,参数说明符为1的格式项格式化列表中的第二个对象,依此类推。

多个格式项可以通过指定相同的参数说明符来引用对象列表中的同一元素。例如,可以通过指定这样的复合格式字符串来将同一数值以十六进制、科学和数字格式进行格式化:" {0:X} {0:E} {0:N}"。

每个格式项都可以引用列表中的任何对象。例如,如果有三个对象,则可以通过指定这样的复合格式字符串来格式化第二个、第一个和第三个对象:" {1} {0} {2}"。未被格式项引用的对象将被忽略。如果参数说明符指定了超出对象列表范围的项,则会导致运行时异常。

对齐组件

可选的对齐组件是一个带符号整数,表示首选格式化字段宽度。如果对齐的值小于格式化字符串的长度,则忽略对齐,并使用格式化字符串的长度作为字段宽度。如果对齐是正数,则字段中的格式化数据将右对齐;如果对齐是负数,则左对齐。如果需要填充,则使用空格。如果指定了对齐,则逗号是必需的。

格式字符串组件

可选的 formatString 组件是一个适用于正在格式化的对象类型的格式字符串。如果相应的对象是数值,则指定标准或自定义数字格式字符串;如果相应的对象是 DateTime 对象,则指定标准或自定义日期和时间格式字符串;如果相应的对象是枚举值,则指定枚举格式字符串。如果未指定 formatString,则使用数字、日期和时间或枚举类型的通用 ("G") 格式说明符。如果指定了 formatString,则冒号是必需的。

请注意,在您的情况下,您只有索引和格式字符串。您没有指定(也不需要)对齐组件。


或者你可以直接获取颜色的完整 Int32 值,并将其写成 {0:X6}(如果 alpha 值对你有意义,则为 {0:X8})。 - BrainSlugs83

51

您还可以通过在 X 后包含一个数字来向左填充字符,例如:string.format("0x{0:X8}", string_to_modify),将得到 "0x00000C20"


我的不填充8。 - tofutim
我必须执行 ("{0}", value.ToString("X8"))。 - tofutim

7

将组成的UInt32颜色Value在.NET中转换为CSS

我知道这个问题适用于3个输入值(red green blue)。但是可能会出现您已经有一个组合的32位Value的情况。看起来您想将数据发送到某个HTML CSS渲染器(因为#HEX格式)。实际上,CSS希望您在此处打印6个或至少3个零填充的十六进制数字。因此需要#{0:X06}#{0:X03}。由于某些奇怪的行为,这总是打印8个数字而不是6个。

通过以下方式解决:

String.Format("#{0:X02}{1:X02}{2:X02}", (Value & 0x00FF0000) >> 16, (Value & 0x0000FF00) >> 8, (Value & 0x000000FF) >> 0)

你提到的这种奇怪行为是否可能是试图将颜色的 alpha 值表示为另一个字节? - Azendale

4
更一般地说。
byte[] buf = new byte[] { 123, 2, 233 };

string s = String.Concat(buf.Select(b => b.ToString("X2")));

3
在.NET 3.5中,格式说明符“X2”会引发异常: “格式字符串只能为“G”、“g”、“X”、“x”、“F”、“f”、“D”或“d”。” 在更高版本的.NET中,提供了其他格式化选项。 请参见此处:https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.85).aspx - Sold Out

2

如果我们有内置的函数可以将整数值转换为COLOR,那么为什么还要担心呢。

string hexValue = string.Format("{0:X}", intColor);

Color brushes = System.Drawing.ColorTranslator.FromHtml("#"+hexValue);

0
这是我老是忘记的表格。它太简单了。
b.ToString("X2")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接