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

输入: uint hex = 0xdeadbeef;

必需输出: string result = "{deadbeef}"

第一种方法:明确添加{} ; 这工作:

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

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

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

似乎很有希望,现在我们需要做的是按照上面的第一种方法添加:x hex规范器:

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

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

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

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

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

编辑

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

从那里:

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

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

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

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

我得到的最近的是

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

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

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

 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 }空格。

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

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