ChatGPT解决这个技术问题 Extra ChatGPT

How to escape braces (curly brackets) in a format string in .NET

How can brackets be escaped in using string.Format?

For example:

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

This example doesn't throw an exception, but it outputs the string foo {0}.

Is there a way to escape the brackets?

MSDN String Formatting FAQ msdn.microsoft.com/en-us/netframework/aa569608: How do I write out a curly bracket in string formats? Do escaped curly brackets have any odd behaviors I need to be aware of? How can I use string formatting to write out something like "{42.00}"?
Unfortunately, the above MSDN link is broken. Currently, the correct link seems to be msdn.microsoft.com/en-us/library/… (seet the QA section at the bottom, or search for "escape" on the page).

P
Peter Mortensen

For you to output foo {1, 2, 3} you have to do something like:

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

To output a { you use {{ and to output a } you use }}.

Or now, you can also use C# string interpolation like this (a feature available in C# 6.0)

Escaping brackets: String interpolation $(""). It is new feature in C# 6.0.

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

"{{" is treated as the escaped bracket character in a format string.
But if you want to add value formatting to your string specifier you need also to read the answer from Guru Kara below.
Read the section Escaping Braces in the official documentation Composite Formatting.
It's also working in new C# 6 string interpolation ($"a = {{ {a} }}")
More specific on the C# 6 string interpolation way, doubling up on the curly works like so string v = $" foo {{{t}}}";. If you has other characters to escape that's not a curly you can use the $@ combo string v2 = $@"\foo {{{t}}}\";
P
Peter Mortensen

Yes, to output { in string.Format you have to escape it like this: {{

So the following will output "foo {1,2,3}".

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

But you have to know about a design bug in C# which is that by going on the above logic you would assume this below code will print {24.00}:

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

But this prints {N}. This is because the way C# parses escape sequences and format characters. To get the desired value in the above case, you have to use this instead:

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

Reference Articles

String.Format gotcha

String Formatting FAQ


If I ran into that bug, I'd write string.Format( "{{{0}}}", i.ToString("N") ); which may be more readable to some.
@Happy It might, but you'd then find yourself specifying the FormatProvider twice, with the risk that you'd specify different ones, or miss one.
M
Michael Irigoyen

Almost there! The escape sequence for a brace is {{ or }} so for your example you would use:

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

R
Ryan Berger

You can use double open brackets and double closing brackets which will only show one bracket on your page.


S
SliverNinja - MSFT

Escaping curly brackets AND using string interpolation makes for an interesting challenge. You need to use quadruple brackets to escape the string interpolation parsing and string.format parsing.

Escaping Brackets: String Interpolation $("") and 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>

P
Peter Mortensen

I came here in search of how to build JSON strings ad-hoc (without serializing a class/object) in C#. In other words, how to escape braces and quotes while using Interpolated Strings in C# and "verbatim string literals" (double quoted strings with '@' prefix), like...

var json = $@"{{""name"":""{name}""}}";

p
pomber
[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);
}

P
Peter Mortensen

Or you can use C# string interpolation like this (feature available in C# 6.0):

var value = "1, 2, 3";
var output = $" foo {{{value}}}";

P
Peter Mortensen

My objective:

I needed to assign the value "{CR}{LF}" to a string variable delimiter.

C# code:

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

Note: To escape special characters normally you have to use \. For opening curly bracket {, use one extra, like {{. For closing curly bracket }, use one extra, }}.


M
Mohamed Anas

You can also use like this. var outVal = $" foo {"{"}{inVal}{"}"} --- {"{"}Also Like This{"}"}"


P
Peter Mortensen

Escaping Brackets: String Interpolation $(""):

Now, you can also use C# string interpolation like this (feature available in C# 6.0):

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

This seems to be a plagiarised version of Jorge Ferreira's answer and/or Aarif's answer (incl. the spelling mistakes) (original revisions).