如何在.NET中的格式字符串中转义大括号(花括号)

Pop*_*lin 954 .net c# string formatting parsing

如何在使用中转义括号string.Format.例如:

String val = "1,2,3"
String.Format(" foo {{0}}", val); 
Run Code Online (Sandbox Code Playgroud)

此示例不会抛出异常,但会输出字符串 foo {0}

有没有办法摆脱括号?

Jor*_*ira 1247

要输出foo {1, 2, 3}你必须做的事情如下:

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
Run Code Online (Sandbox Code Playgroud)

输出{您使用{{并输出}您使用的}}.

  • "{{"被视为格式字符串中的转义括号字符. (104认同)
  • 它也用于新的C#6字符串插值(`$"a = {{{a}}}"`) (8认同)
  • 但是如果你想为你的字符串说明符添加值格式,你还需要阅读下面的Guru Kara的答案. (5认同)
  • 请阅读官方文档 [_Composite Formatting_](http://msdn.microsoft.com/en-us/library/txafckwd.aspx) 中的_Escaping Braces_ 部分。 (2认同)

Gur*_*ara 205

是输出{string.Format,你必须逃脱它像这样{{

所以这

String val = "1,2,3";
String.Format(" foo {{{0}}}", val);
Run Code Online (Sandbox Code Playgroud)

将输出"foo {1,2,3}".

但你必须知道C#中的一个设计错误,通过上面的逻辑,你会假设下面的代码会打印{24.00}

int i = 24;
string str = String.Format("{{{0:N}}}", i); //gives '{N}' instead of {24.00}
Run Code Online (Sandbox Code Playgroud)

但这打印{N}.这是因为C#解析转义序列和格式化字符的方式.要在上述情况下获得所需的值,您必须使用它.

String.Format("{0}{1:N}{2}", "{", i, "}") //evaluates to {24.00}
Run Code Online (Sandbox Code Playgroud)

参考文章 String.Format gottachString Formatting FAQ

  • 如果我遇到那个bug,我会写`string.Format("{{{0}}}",i.ToString("N"));`这对某些人来说可能更具可读性. (12认同)
  • @Happy可能会,但是您会发现自己指定了 FormatProvider 两次,存在指定不同的或错过一个的风险。 (2认同)

Wol*_*yrd 74

差不多了!为支柱的转义序列{{}}使你的例子中,你可以使用:

string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
Run Code Online (Sandbox Code Playgroud)


小智 22

您可以使用双开括号和双关闭括号,它们只会在您的页面上显示一个括号.


Sli*_*SFT 13

转义大括号并使用字符串插值是一个有趣的挑战.您需要使用四重括号来转义字符串插值解析和string.format解析.

转义括号:字符串插值$("")和String.Format

string localVar = "dynamic";
string templateString = $@"<h2>{0}</h2><div>this is my {localVar} template using a {{{{custom tag}}}}</div>";
string result = string.Format(templateString, "String Interpolation");

// OUTPUT: <h2>String Interpolation</h2><div>this is my dynamic template using a {custom tag}</div>
Run Code Online (Sandbox Code Playgroud)


Ada*_*Cox 6

来到这里寻求如何在C#中临时构建json字符串(不序列化类/对象)。换句话说,如何在C#和“ 逐字字符串文字 ”(带'@'前缀的双引号字符串)中使用插值字符串时转义括号和引号,例如...

var json = $@"{{""name"":""{name}""}}";
Run Code Online (Sandbox Code Playgroud)


pom*_*ber 5

[TestMethod]
public void BraceEscapingTest()
{
    var result = String.Format("Foo {{0}}", "1,2,3");  //"1,2,3" is not parsed
    Assert.AreEqual("Foo {0}", result);

    result = String.Format("Foo {{{0}}}", "1,2,3");
    Assert.AreEqual("Foo {1,2,3}", result);

    result = String.Format("Foo {0} {{bar}}", "1,2,3");
    Assert.AreEqual("Foo 1,2,3 {bar}", result);

    result = String.Format("{{{0:N}}}", 24); //24 is not parsed, see @Guru Kara answer
    Assert.AreEqual("{N}", result);

    result = String.Format("{0}{1:N}{2}", "{", 24, "}");
    Assert.AreEqual("{24.00}", result);

    result = String.Format("{{{0}}}", 24.ToString("N"));
    Assert.AreEqual("{24.00}", result);
}
Run Code Online (Sandbox Code Playgroud)