使用大括号格式化字符串

ja7*_*a72 27 c# string-formatting

我想{$100.00}使用带有的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 }"
}
Run Code Online (Sandbox Code Playgroud)

那么我应该使用上面的格式字符串来获得{$100}不使用笨重的解决方案,例如string.Format("{0}{1:C}{2}", "{", x, "}");

D S*_*ley 34

这实际上是在MSDN下的复合格式化文档中记录的:

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

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

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

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

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

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

  • 有一篇[博客文章](http://blogs.msdn.com/b/brada/archive/2003/12/26/50978.aspx)也有相关信息. (5认同)

Nor*_*olc 14

尝试使用此代码:

string.Format("{{{0}}}", x.ToString("C"))
Run Code Online (Sandbox Code Playgroud)

  • @Cyral不一定.OP可能正在使用一些具有他/她试图设置的"格式"属性的控件.使用`ToString`可能只是一种说明问题而不直接引用实际源的方法.因此,在值上添加"ToString"可能不是一个可行的选择. (6认同)