Cách thoát dấu ngoặc (ngoặc nhọn) trong chuỗi định dạng trong .NET


988

Làm thế nào dấu ngoặc có thể được thoát trong bằng cách sử dụng string.Format.

Ví dụ:

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

Ví dụ này không đưa ra một ngoại lệ, nhưng đưa ra chuỗi foo {0}.

Có cách nào để thoát khỏi dấu ngoặc?


1
Câu hỏi thường gặp về định dạng chuỗi MSDN msDN.microsoft.com/en-us/netframework/aa569608 : Làm cách nào để tôi viết ra một dấu ngoặc nhọn trong các định dạng chuỗi? Có thoát dấu ngoặc nhọn có bất kỳ hành vi kỳ lạ tôi cần phải nhận thức? Làm cách nào tôi có thể sử dụng định dạng chuỗi để viết ra một cái gì đó như "{42.00}"?
gerryLowry

1
Thật không may, liên kết MSDN ở trên bị hỏng. Hiện tại, liên kết chính xác dường như là msdn.microsoft.com/en-us/l Library / 21 (tìm phần QA ở phía dưới hoặc tìm kiếm "thoát" trên trang).
Palo Mraz

Câu trả lời:


1283

Để bạn xuất ra, foo {1, 2, 3}bạn phải làm một cái gì đó như:

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

Để xuất một {bạn sử dụng {{và để xuất một }bạn sử dụng }}.

hoặc Bây giờ, bạn cũng có thể sử dụng phép nội suy chuỗi c # như thế này (tính năng có sẵn trong C # 6.0)

Chân đế thoát: Nội suy chuỗi $ ("") . đây là tính năng mới trong C # 6.0

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

108
"{{" Được coi là ký tự dấu ngoặc trong chuỗi định dạng.
icelava

5
Nhưng nếu bạn muốn thêm định dạng giá trị vào bộ xác định chuỗi của mình, bạn cũng cần đọc câu trả lời từ Guru Kara bên dưới.
Nick

Đọc phần Thoát khỏi Niềng răng trong tài liệu chính thức Định dạng tổng hợp .
Jeppe Stig Nielsen

8
Nó cũng hoạt động trong phép nội suy chuỗi C # 6 mới ( $"a = {{ {a} }}")
Mahmoodvcs

Cụ thể hơn về cách nội suy chuỗi C # 6, tăng gấp đôi trên các công việc xoăn như vậy string v = $" foo {{{t}}}";. Nếu bạn có các nhân vật khác để thoát khỏi đó không phải là xoăn bạn có thể sử dụng $ @ Combostring v2 = $@"\foo {{{t}}}\";
Nhân

209

Có để đầu ra {trong string.Formatbạn phải thoát nó như thế này{{

Vậy đây

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

sẽ đầu ra "foo {1,2,3}".

NHƯNG bạn phải biết về một lỗi thiết kế trong C #, đó là bằng cách sử dụng logic trên, bạn sẽ cho rằng đoạn mã dưới đây sẽ in {24.00}

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

Nhưng điều này in {N}. Điều này là do cách C # phân tích cú pháp thoát khỏi chuỗi và định dạng ký tự. Để có được giá trị mong muốn trong trường hợp trên, bạn phải sử dụng thay thế.

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

Tham khảo bài viết String.Format gottachđịnh dạng chuỗi


12
Nếu tôi gặp phải lỗi đó, tôi sẽ viết string.Format( "{{{0}}}", i.ToString("N") );một số có thể dễ đọc hơn đối với một số người.
HappyNomad

1
@Happy Có thể, nhưng sau đó bạn sẽ thấy mình chỉ định FormatProvider hai lần, với rủi ro là bạn chỉ định những cái khác nhau hoặc bỏ lỡ một cái.
ClickRick

74

Sắp đến rồi! Trình tự thoát cho một cú đúp là {{hoặc }}ví dụ như bạn sẽ sử dụng:

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

22

Bạn có thể sử dụng dấu ngoặc kép mở và dấu ngoặc kép sẽ chỉ hiển thị một dấu ngoặc trên trang của bạn.


13

Thoát khỏi dấu ngoặc nhọn VÀ sử dụng phép nội suy chuỗi tạo nên một thách thức thú vị. Bạn cần sử dụng dấu ngoặc kép để thoát khỏi phân tích cú pháp và phân tích nội suy chuỗistring.format .

Thoát khỏi dấu ngoặc: Nội suy chuỗi $ ("") và 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

Đến đây để tìm cách xây dựng chuỗi json ad-hoc (không nối tiếp một lớp / đối tượng) trong C #. Nói cách khác, làm thế nào để thoát dấu ngoặc và dấu ngoặc kép trong khi sử dụng Chuỗi nội suy trong C # và " nguyên văn chuỗi ký tự " (chuỗi trích dẫn kép có tiền tố '@'), như ...

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

hoặc bạn có thể sử dụng phép nội suy chuỗi c # như thế này (tính năng có sẵn trong C # 6.0)

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

1

Chân đế thoát: Nội suy chuỗi $ (""):

Bây giờ, bạn cũng có thể sử dụng phép nội suy chuỗi c # như thế này (tính năng có sẵn trong C # 6.0)

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

0

Mục tiêu của tôi:

Tôi cần gán giá trị "{CR}{LF}"cho một stringbiến delimiter.

Mã c #:

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

Lưu ý: Để thoát các ký tự đặc biệt thông thường, bạn phải sử dụng. Để mở dấu ngoặc nhọn {, hãy sử dụng thêm một dấu như {{. Để đóng ngoặc nhọn}, hãy sử dụng thêm một}}.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.