C# String.Format不能为数字格式提供正确的结果

C# String.Format不能为数字格式提供正确的结果,c#,string-formatting,C#,String Formatting,为什么以下输出提供不正确的结果 int myNumber = 95; Console.WriteLine(String.Format("{{{0:N}}}", myNumber )); 输出是{N},而不是预期的{95.00} 我是否误解了转义的概念{}或者数字格式有问题?是的,给出的输出是完全正确的,您的理解也是正确的,即字符串中的{,}。格式应该通过{/code>,转义分别设置字符串的格式,并且必须使用{0:N} 但是,当您查找输出时,{95.00}格式,{{{{0

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

int myNumber = 95;            
Console.WriteLine(String.Format("{{{0:N}}}", myNumber ));
输出是
{N}
,而不是预期的
{95.00}


我是否误解了转义的概念{}或者数字格式有问题?

是的,给出的输出是完全正确的,您的理解也是正确的,即
字符串中的
{
}
。格式
应该通过
{/code>,
转义
分别设置字符串的格式,并且必须使用
{0:N}

但是,当您查找输出时,
{95.00}
格式,
{{{{0:N}}}
没有按预期工作,因此我们应该了解上述语句的解释方式

  • 正如我们理解的那样,前两个花括号被转义为
    {
    ,后面是
    {
    , 在输出时打印
    {

  • 然后我们有一个格式化部分
    {0:N}}
    ,但编译器感到困惑的是
    }
    {0:N
    的结束大括号,或者它是转义大括号,因为它后面跟着
    }
    ,这导致形成自定义格式
    0:N}
    。但是规则说它应该被视为自定义格式,因此它实际上被解释为包含
    0:N}
  • 由于
    N
    }
    对于自定义数字格式都没有任何意义,因此这些字符只是简单地写出,而不是所引用变量的值
因此我们有了输出,
{N}

有关上述内容的详细说明,请访问

如果您正在查找输出
{95.00}
,则使用
{{{0:N}}}
,它将提供带有空格的
95.00
作为输出

编辑的解决方案非常适合您期望的输出

Console.WriteLine(String.Format("{0}{1:N}{2}", "{", myNumber, "}"));

您的理解是正确的:使用两个大括号创建单个文字大括号。但是,问题是,在字符串
}
中,前两个大括号被解释为文字大括号,而不是您想要的第二个和第三个大括号

事实上,您的示例已在上明确列出为一个可能的问题(由我强调):

解释转义大括号的方式可能会导致意外的结果。例如,考虑格式项“{{{ 0:d}}}”,它意在显示一个开口括号、一个以十进制数格式化的数值和一个闭合括号。但是,格式项实际上按以下方式解释:

  • 下一个字符(“D”)将被解释为十进制标准数字格式说明符,但下两个转义大括号(“}”)将产生一个大括号。
建议的解决方案是使用如下内容:

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

否决投票的原因是什么?任何具体原因……你的答案是正确的,这是我唯一想要的结果,但dbw的解释更清楚,这就是为什么我接受他的答案