【问题标题】:String.Format for Hex十六进制的 String.Format
【发布时间】:2012-07-22 00:49:42
【问题描述】:

使用下面的代码,着色总是给出#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);

【问题讨论】:

  • RGB Hex 颜色字符串不应该是Red, Green, Blue 吗?
  • @mellamokb 可能是不同的字节顺序。

标签: c# string formatting hex


【解决方案1】:

{0:X} 中的数字0 指的是列表或参数中的位置。在这种情况下,0 表示使用第一个值,即Blue。使用 {1:X} 作为第二个参数 (Green),依此类推。

colorstring = String.Format("#{0:X}{1:X}{2:X}{3:X}", Blue, Green, Red, Space);

格式参数的语法在documentation中描述:

格式化项目语法

每个格式项采用以下形式并由以下组件组成:

{ index[,alignment][:formatString]}

需要匹配的大括号(“{”和“}”)。

索引组件

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

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

每个格式项可以引用列表中的任何对象。例如,如果有三个对象,您可以通过指定如下复合格式字符串来格式化第二个、第一个和第三个对象:“{1} {0} {2}”。格式项未引用的对象将被忽略。如果参数说明符指定了对象列表边界之外的项目,则会导致运行时异常。

对齐组件

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

格式化字符串组件

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

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

【讨论】:

  • 或者您可以获取颜色的完整 Int32 并将其写为 {0:X6}(或 {0:X8},如果 alpha 值对您有意义)。跨度>
【解决方案2】:

您还可以通过在X 后面添加一个数字来填充左边的字符,例如:string.format("0x{0:X8}", string_to_modify),这会产生"0x00000C20"

【讨论】:

  • 我的不垫8
  • 我不得不做 ("{0}", value.ToString("X8"))
【解决方案3】:

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

我知道这个问题适用于 3 个输入值(redgreenblue)。但可能存在您已经拥有组合的 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 值表示为另一个字节?
【解决方案4】:

如果我们内置了将整数值转换为颜色的函数,那何必担心呢。

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

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

【讨论】:

    【解决方案5】:

    更一般地说。

    byte[] buf = new byte[] { 123, 2, 233 };
    
    string s = String.Concat(buf.Select(b => b.ToString("X2")));
    

    【讨论】:

    • 在 .NET 3.5 fromat 说明符“X2”中抛出异常:“格式字符串只能是“G”、“g”、“X”、“x”、“F”、“f”, “D”或“d”。” 在更高的 .NET 版本中,其他格式可用。见这里:msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.85).aspx
    猜你喜欢
    • 2012-03-25
    • 2012-10-31
    • 2011-12-09
    • 2018-07-26
    • 2011-06-01
    • 2014-08-24
    • 2014-04-20
    • 2011-02-27
    相关资源
    最近更新 更多