如何使用字符串.格式化()以格式化由花括号包围的十六进制数字

本文关键字:格式化 包围 十六进制数字 字符串 何使用 | 更新日期: 2023-09-27 18:12:48

输入: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()的调用。

(这很可能是重复的问题,但到目前为止我还找不到重复的…(

已编辑

如何使用字符串.格式化()以格式化由花括号包围的十六进制数字

请参阅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}

发生这种情况是因为在字符串中输出。格式您必须像这样转义}}

但当您输入}}}时,它会像}} }一样理解这一点,并输出{x}。这是C#中的一个设计错误,当您尝试像:x:N或else那样格式化输出时。

你也可以试试

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

但这会输出带有空格的{ deadbeef }

试试这个:使用两次类似的String.Format方法

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