如何使用string.Format()格式化大括号括起来的十六进制数?

时间:2016-10-13 08:42:09

标签: c# string.format

输入: uint hex = 0xdeadbeef;

必填项: string result = "{deadbeef}"

第一种方法:明确添加{};这有效:

result = "{" + string.Format("{0:x}", hex) + "}"; // -> "{deadbeef}"

使用转义大括号输出为十进制而不是十六进制:

result = string.Format("{{{0}}}", hex); // -> "{3735928559}"

似乎很有希望,现在我们需要做的就是按照上面的第一种方法添加:x十六进制说明符:

result = string.Format("{{{0:x}}}", hex); // -> "{x}"

哦亲爱的,添加':x已经输出"{x}"而不是我想要的"{deadbeef}"

所以我的问题是:我必须按照第一个示例显式添加{}来解决这个问题,还是有办法使用复合格式化并转义大括号?

另请注意,这也会影响字符串插值,毕竟编译器只是将其转换为对string.Format()的调用。

(这可能是重复的问题,但到目前为止我一直无法找到重复的内容......)

编辑

4 个答案:

答案 0 :(得分:7)

请参阅http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx中的“转义大括号” - 基本上您的解决方法是一种解决方案。

从那里:

  

解释转义大括号的方式会导致意外结果。   例如,请考虑格式项“{{{0:D}}}”   显示左括号,一个格式为十进制的数值   数字和右括号。但是,格式项实际上是   按以下方式解释:

     

1.前两个开口支架(“{{”)被转义并产生一个开口支架   2.接下来的三个字符(“{0:”)被解释为格式项的开头   3.下一个字符(“D”)将被解释为十进制标准   数字格式说明符,但接下来的两个转义大括号(“}}”)产生   单支撑。因为结果字符串(“D}”)不是标准   数字格式说明符,结果字符串被解释为a   自定义格式字符串,表示显示文字字符串“D}”   4.最后一个括号(“}”)被解释为格式项的结尾   5.显示的最终结果是文字字符串“{D}”。该   将不显示要格式化的数值。

作为解决方案,根据您的示例调整:

uint hex = 0xdeadbeef;
string output = string.Format("{0}{1:x}{2}", 
                             "{", hex, "}");
Console.WriteLine(output);

答案 1 :(得分:3)

我得到的最近的是

string.Format("{{{0:x}\u200B}}",16)

似乎}}}被解释错误,插入零宽度空格会阻止前两个}被扩展为转义的}字符。

答案 2 :(得分:2)

您可以使用空字符或添加括号作为参数:

uint hex = 0xdeadbeef;
string result = string.Format("{0}{1:x}{2}", "{", hex, "}");

这将根据您的需要输出{deadbeef}

这是因为要在string.Format中输出} ,您必须像}} 一样将其转义。

但是当您输入}}}时,它会理解为}} }并输出{x}。当您尝试格式化输出时,这是C#中的设计错误,如:x:N或其他。

您也可以尝试

uint hex = 0xdeadbeef;
string result = string.Format("{{ {1:x} }}", hex);

但是这会输出{ deadbeef }空格。

答案 3 :(得分:2)

试试这个:使用2次String.Format这样的方法

String result= String.Format("{{{0}}}",String.Format("{0:x}", hex));