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

Mat*_*son 13 c# string.format

输入: uint hex = 0xdeadbeef;

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

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

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

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

result = string.Format("{{{0}}}", hex); // -> "{3735928559}"
Run Code Online (Sandbox Code Playgroud)

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

result = string.Format("{{{0:x}}}", hex); // -> "{x}"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑

Han*_*ing 7

请参阅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);
Run Code Online (Sandbox Code Playgroud)