Pop Catalin
Pop Catalin

Reputation: 62920

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?

Upvotes: 1186

Views: 387780

Answers (13)

Adel Mourad
Adel Mourad

Reputation: 1547

I wanted to escape {{Id}} while I'm in a string interpolation.

This worked for me:

string url = $"/Details/{{{{Id}}}}";

Output:

/Details/{{Id}}

Upvotes: 1

SliverNinja - MSFT
SliverNinja - MSFT

Reputation: 31641

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>

Upvotes: 17

Mohamed Anas
Mohamed Anas

Reputation: 312

You can also use it like this:

var outVal = $" foo {"{"}{inVal}{"}"} --- {"{"}Also Like This{"}"}"

Upvotes: 2

Eldar
Eldar

Reputation: 10780

For the raw string literals (which start with 3x double quotes), the above answers won't work but you can work the other way around: You can change the number of curly braces to use in the literal by adding $ at the start. $$""" """ means you need {{ to apply a template value. To answer the OP the below will work:

var formatted = $$"""foo {{{val}}}""";

The output will be:

foo {1, 2, 3}

Fiddle

Upvotes: 7

Manish Kumar Gurjar
Manish Kumar Gurjar

Reputation: 655

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}

Upvotes: 1

Goldfish
Goldfish

Reputation: 702

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, }}.

Upvotes: 3

Aarif
Aarif

Reputation: 1675

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

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

Upvotes: 5

Adam Cox
Adam Cox

Reputation: 3661

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}""}}";

Upvotes: 20

Guru Kara
Guru Kara

Reputation: 6462

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

Upvotes: 234

Jorge Ferreira
Jorge Ferreira

Reputation: 97839

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}

Upvotes: 1495

pomber
pomber

Reputation: 23980

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

Upvotes: 8

Wolfwyrd
Wolfwyrd

Reputation: 15906

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);

Upvotes: 85

elec
elec

Reputation: 261

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

Upvotes: 26

Related Questions