String.Format不提供数字格式的正确结果

时间:2013-12-09 07:07:21

标签: c# string-formatting

为什么以下输出提供的结果不正确

int myNumber = 95;            
Console.WriteLine(String.Format("{{{0:N}}}", myNumber ));

输出为{N},而不是预期的{95.00}

我是否误解了逃避{ }或使用数字格式做错事的概念?

2 个答案:

答案 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, "}"));