如何使用字符串.格式化()以格式化由花括号包围的十六进制数字
本文关键字:格式化 包围 十六进制数字 字符串 何使用 | 更新日期: 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));