输入: 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()
的调用。
(这可能是重复的问题,但到目前为止我一直无法找到重复的内容......)
编辑
答案 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));