使用大括号格式化字符串

时间:2014-08-14 15:49:25

标签: c# string-formatting

我想使用带有{$100.00}的{​​{1}}语句在大括号内输出格式化的数字(例如string.Format(fmt, x))。

x=100

那么我应该使用上面的格式字符串来获取{ var x = 100M; // works fine without a format specifier string.Format("{{{0}}}", x); // "{100.00}" // fails with a format specifier string.Format("{{{0:C}}}", x); // "{C}" // works with spaces string.Format("{{ {0:C} }}", x); // "{ $100.00 }" } 而不使用笨重的解决方案,例如{$100}

3 个答案:

答案 0 :(得分:34)

这实际上是在Composite Formatting下的MSDN上记录的:

  

解释转义大括号的方式会导致意外结果。例如,考虑格式项"{{{0:D}}}",其用于显示左括号,格式为十进制数的数值和右括号。但是,格式项实际上是按以下方式解释的:

     
      
  1. 前两个开口大括号("{{")被转义并产生一个左大括号。
  2.   
  3. 接下来的三个字符("{0:")被解释为格式项的开头。
  4.   
  5. 下一个字符("D")将被解释为十进制标准数字格式说明符,但接下来的两个转义大括号("}}")会产生一个大括号。由于结果字符串("D}")不是标准数字格式说明符,因此结果字符串将被解释为自定义格式字符串,这意味着显示文字字符串"D}"
  6.   
  7. 最后一个大括号("}")被解释为格式项的结尾。
  8.   
  9. 显示的最终结果是文字字符串"{D}"。将不显示要格式化的数值。
  10.         

    编写代码以避免错误解释转义大括号和格式项的一种方法是分别格式化大括号和格式项。也就是说,在第一格式操作中显示文字开口括号,在下一操作中显示格式项的结果,然后在最终操作中显示文字关闭括号。以下示例说明了这种方法。

    int value = 6324;
    string output = string.Format("{0}{1:D}{2}", 
                                 "{", value, "}");
    Console.WriteLine(output);
    // The example displays the following output: 
    //       {6324}
    

(请注意,我仅添加代码,因为它在MSDN文章中引用 - 不建议将其作为解决方案。)

如果您不关心文化差异,可以使用"{{{0:$#,##0.00}}}"作为格式字符串。

答案 1 :(得分:14)

尝试使用此代码:

string.Format("{{{0}}}", x.ToString("C"))

答案 2 :(得分:4)

根据应用程序的不同,您可以使用zero-width space来欺骗string.Format方法来执行您想要的操作。有关选项列表,请参阅Spaces in Unicode,但\x200B会为C#字符串添加零宽度空间,因此您可以尝试使用:

string.Format("Pi is {{{0:N2}\x200B}} when rounded", Math.PI)

在支持unicode的应用程序中显示时应导致Pi is {3.14​} when rounded。如果应用程序不支持unicode,它可能最终看起来像Pi is {3.14​} when rounded