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?


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}

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


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

22

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


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>

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

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

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

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}

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.