代码之家  ›  专栏  ›  技术社区  ›  Pop Catalin

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

  •  902
  • Pop Catalin  · 技术社区  · 16 年前

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

    例如:

    String val = "1,2,3"
    String.Format(" foo {{0}}", val);
    

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

    有没有办法逃出括号?

    9 回复  |  直到 3 年前
        1
  •  1382
  •   Peter Mortensen icecrime    3 年前

    供您输出 foo {1, 2, 3}

    string t = "1, 2, 3";
    string v = String.Format(" foo {{{0}}}", t);
    

    输出 { {{ 并输出一个 } 你用 }} .

    或者现在,您也可以像这样使用C#字符串插值(C#6.0中提供的功能)

    转义括号:字符串插值$(“”)

    var inVal = "1, 2, 3";
    var outVal = $" foo {{{inVal}}}";
    // The output will be:  foo {1, 2, 3}
    
        2
  •  219
  •   Peter Mortensen icecrime    3 年前

    是的,输出 { 在里面 string.Format 你必须像这样逃避它: {{

    "foo {1,2,3}" .

    String val = "1,2,3";
    String.Format(" foo {{{0}}}", val);
    

    但是 您必须了解C#中的一个设计缺陷,即通过执行上述逻辑,您将假定以下代码将打印{24.00}:

    int i = 24;
    string str = String.Format("{{{0:N}}}", i); // Gives '{N}' instead of {24.00}
    

    String.Format("{0}{1:N}{2}", "{", i, "}") // Evaluates to {24.00}
    

        3
  •  80
  •   Michael Irigoyen    12 年前

    快到了!大括号的转义序列是 {{ }} 因此,对于您的示例,您将使用:

    string t = "1, 2, 3";
    string v = String.Format(" foo {{{0}}}", t);
    
        4
  •  24
  •   Ryan Berger    13 年前

        5
  •  14
  •   SliverNinja - MSFT    7 年前

    逃逸 花括号 和使用 字符串插值 这是一个有趣的挑战。你需要使用 四个支架 逃脱 字符串插值 解析和 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>
    
        6
  •  10
  •   Peter Mortensen icecrime    3 年前

    我来这里是为了研究如何在C#中构建JSON字符串(无需序列化类/对象)。换句话说,如何在使用 Interpolated Strings in C# 及" verbatim string literals

    var json = $@"{{""name"":""{name}""}}";
    
        7
  •  5
  •   pomber    9 年前
    [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);
    }
    
        8
  •  2
  •   Peter Mortensen icecrime    3 年前

    或者您可以像这样使用C#字符串插值(C#6.0中提供的功能):

    var value = "1, 2, 3";
    var output = $" foo {{{value}}}";
    
        9
  •  2
  •   Peter Mortensen icecrime    3 年前

    我的目标:

    我需要赋值 "{CR}{LF}" string delimiter .

    string delimiter= "{{CR}}{{LF}}";
    

    { ,使用一个额外的,如 {{ . 用于关闭花括号 } }}

        10
  •  0
  •   Peter Mortensen icecrime    3 年前

    转义括号:字符串插值$(“”):

    现在,您还可以像这样使用C#字符串插值(C#6.0中提供的功能):

    var inVal = "1, 2, 3";
    var outVal = $" foo {{{inVal}}}";
    // The output will be:  foo {1, 2, 3}