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的解释更清楚,这就是为什么我接受他的答案