Cara menghindari kawat gigi (kurung keriting) dalam string format di .NET

988

Bagaimana kurung bisa lolos dalam menggunakan string.Format.

Sebagai contoh:

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

Contoh ini tidak melempar pengecualian, tetapi menghasilkan string foo {0}.

Apakah ada cara untuk keluar dari kurung?

Pop Catalin
sumber
1
FAQ Pemformatan String MSDN msdn.microsoft.com/en-us/netframework/aa569608 : Bagaimana cara saya menulis kurung kurawal dalam format string? Apakah kurung keriting yang lolos memiliki perilaku aneh yang perlu saya waspadai? Bagaimana saya bisa menggunakan pemformatan string untuk menulis sesuatu seperti "{42.00}"?
gerryLowry
1
Sayangnya, tautan MSDN di atas rusak. Saat ini, tautan yang benar tampaknya msdn.microsoft.com/en-us/library/… (lihat bagian QA di bagian bawah, atau cari "escape" di halaman).
Palo Mraz

Jawaban:

1283

Bagi Anda untuk output, foo {1, 2, 3}Anda harus melakukan sesuatu seperti:

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

Untuk output yang {Anda gunakan {{dan untuk output yang }Anda gunakan }}.

atau Sekarang, Anda juga dapat menggunakan interpolasi string c # seperti ini (fitur tersedia dalam C # 6.0)

Escaping Brackets: Interpolasi String $ ("") . itu adalah fitur baru di C # 6.0

var inVal = "1, 2, 3";
var outVal = $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}
Jorge Ferreira
sumber
108
"{{" diperlakukan sebagai karakter tanda kurung yang lolos dalam string format.
icelava
5
Tetapi jika Anda ingin menambahkan pemformatan nilai ke specifier string Anda, Anda juga perlu membaca jawaban dari Guru Kara di bawah ini.
Nick
Baca bagian Melarikan Diri Kawat Gigi di dokumentasi resmi Memformat Komposit .
Jeppe Stig Nielsen
8
Ini juga bekerja di interpolasi string C # 6 baru ( $"a = {{ {a} }}")
Mahmoodvcs
Lebih spesifik pada cara interpolasi string C # 6, menggandakan pada keriting berfungsi seperti itu string v = $" foo {{{t}}}";. Jika Anda memiliki karakter lain untuk melarikan diri yang bukan keriting, Anda dapat menggunakan $ @ combostring v2 = $@"\foo {{{t}}}\";
Nhan
209

Ya untuk output {dalam string.FormatAnda harus melarikan diri seperti ini{{

Jadi ini

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

akan menampilkan "foo {1,2,3}".

TETAPI Anda harus tahu tentang bug desain di C # yang dengan pergi pada logika di atas Anda akan menganggap kode di bawah ini akan mencetak {24.00}

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

Tapi ini mencetak {N}. Ini karena cara C # mem-parsing lolos dari urutan dan memformat karakter. Untuk mendapatkan nilai yang diinginkan dalam kasus di atas, Anda harus menggunakan ini.

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

Referensi Artikel String.Format gottach dan FAQ Pemformatan String

Guru Kara
sumber
12
Jika saya menemukan bug itu, saya akan menulis string.Format( "{{{0}}}", i.ToString("N") );yang mungkin lebih mudah dibaca oleh beberapa orang.
HappyNomad
1
@Bahagia Itu mungkin, tetapi kemudian Anda akan menemukan diri Anda menentukan FormatProvider dua kali, dengan risiko Anda akan menentukan yang berbeda, atau melewatkan satu.
ClickRick
74

Hampir sampai! Urutan escape untuk brace adalah {{atau }}lebih untuk contoh Anda, Anda akan menggunakan:

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

Anda dapat menggunakan kurung buka ganda dan kurung tutup ganda yang hanya akan menampilkan satu braket pada halaman Anda.

elec
sumber
13

Lolos kurung keriting DAN menggunakan interpolasi string membuat tantangan yang menarik. Anda perlu menggunakan kurung quadruple untuk menghindari parsing dan parsing interpolasi stringstring.format .

Escaping Brackets: Interpolasi String $ ("") dan 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>
SliverNinja - MSFT
sumber
8

Datang ke sini untuk mencari cara membuat string json ad-hoc (tanpa membuat serial kelas / objek) di C #. Dengan kata lain, bagaimana cara melepaskan kurung kurawal dan kutipan saat menggunakan String Interpolasi dalam C # dan " string kata demi kata " (string ganda dikutip dengan awalan '@'), seperti ...

var json = $@"{{""name"":""{name}""}}";
Adam Cox
sumber
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);
}
pomber
sumber
2

atau Anda dapat menggunakan c # string interpolasi seperti ini (fitur tersedia di C # 6.0)

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

Lolos Kurung: String Interpolasi $ (""):

Sekarang, Anda juga dapat menggunakan interpolasi c # string seperti ini (fitur tersedia di C # 6.0)

var inVal= "1, 2, 3";
var outVal= $" foo {{{inVal}}}";
//Output will be:  foo {1, 2, 3}
Manish Kumar Gurjar
sumber
0

Tujuan saya:

Saya perlu menetapkan nilai "{CR}{LF}"ke stringvariabel delimiter.

Kode c #:

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

Catatan: Untuk keluar dari karakter khusus biasanya Anda harus menggunakan. Untuk membuka braket keriting {, gunakan satu ekstra seperti {{. Untuk menutup braket keriting}, gunakan satu tambahan}}.

Ikan mas
sumber