为什么以下输出提供的结果不正确
int myNumber = 95;
Console.WriteLine(String.Format("{{{0:N}}}", myNumber ));
输出为{N}
,而不是预期的{95.00}
。
我是否误解了逃避{
}
或使用数字格式做错事的概念?
答案 0 :(得分:7)
您的理解是正确的:使用两个大括号来创建单个文字大括号。但问题是,在字符串}}}
中,前两个大括号被解释为文字大括号,而不是第二个和第三个,如你想要的。
事实上,您的示例已明确列在corresponding MSDN page上作为可能的问题(由我突出显示):
解释转义大括号的方式会导致意外结果。例如,请考虑格式项“{{{0:D}}}”,其用于显示左大括号,格式为十进制数的数值以及右大括号。但是,格式项实际上是按以下方式解释的:
...
- 下一个字符(“D”)将被解释为十进制标准数字格式说明符,但接下来的两个转义大括号(“}}”)会产生一个大括号。
建议的解决方案是使用以下内容:
int myNumber = 95;
Console.WriteLine(String.Format("{0}{1:N}{2}", "{", myNumber, "}"));
答案 1 :(得分:6)
是的,给出的ouptut是完全正确的,您的理解也是正确的,{
,}
中的string.Format
应该{
,}
转义分别在数字中格式化字符串,你必须使用{0:N}
。
但是当你在寻找输出{95.00}
时,格式{{{0:N}}}
不能按预期工作,为此我们不应该理解上述语句的解释方式,
{
后跟{
,前两个花括号进行转义,
在输出
处打印{
{0:N}}}
但是编译器感到困惑,}
正在结束{0:N
,或者它是转义大括号,因为它后跟}
结果形成自定义格式0:N}
。但规则说它应该被视为自定义格式,因此它实际上被解释为包含0:N}
N
或}
都不代表自定义数字格式的任何内容,因此只会写出这些字符,而不是引用的变量的值。 因此我们有输出{N}
。
上面的详细说明可以在string Format FAQ
找到如果您要查找输出 {95.00}
,请使用 {{ {0:N} }}
,它将提供95.00
作为空间输出。
编辑 Heinzi的解决方案完全适合您期望的输出,
Console.WriteLine(String.Format("{0}{1:N}{2}", "{", myNumber, "}"));