.NET'te bir biçim dizesinde kaşlı ayraçlardan (süslü parantez) kaçma


988

Köşeli parantezler nasıl kullanılır string.Format?

Örneğin:

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

Bu örnek bir istisna atmaz, ancak dizeyi çıktılar foo {0}.

Köşeli parantezlerden kaçmanın bir yolu var mı?


1
MSDN Dize Biçimlendirme SSS msdn.microsoft.com/tr-tr/netframework/aa569608 : Kıvrımlı bir dizeyi dize biçimlerinde nasıl yazarım? Kaçan kıvırcık parantezlerin bilmem gereken garip davranışları var mı? "{42.00}" gibi bir şey yazmak için dize biçimlendirmeyi nasıl kullanabilirim?
gerryLowry

1
Ne yazık ki, yukarıdaki MSDN bağlantısı bozuk. Şu anda, doğru bağlantı msdn.microsoft.com/en-us/library/… (alt kısımdaki KG bölümüne bakın veya sayfada "kaçış" ifadesini arayın) gibi görünüyor.
Palo Mraz

Yanıtlar:


1283

Çıktı foo {1, 2, 3}almak için şöyle bir şey yapmanız gerekir:

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

Bir çıktı almak {için kullanın {{ve çıktı almak }için kullanın }}.

veya Şimdi, bunun gibi c # string enterpolasyonunu da kullanabilirsiniz (C # 6.0'da bulunan özellik)

Kaçan Köşeli Ayraçlar: String Interpolation $ ("") . C # 6.0'daki yeni özellik

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

108
"{{", bir biçim dizesinde kaçan köşeli ayraç karakteri olarak kabul edilir.
icelava

5
Ancak dize belirleyicinize değer biçimlendirmesi eklemek istiyorsanız, aşağıdaki Guru Kara'dan gelen yanıtı da okumalısınız.
Nick

Resmi dokümantasyon Kompozit Biçimlendirme bölümünden Kaçaklar bölümünü okuyun .
Jeppe Stig Nielsen

8
Ayrıca yeni C # 6 string interpolation ( $"a = {{ {a} }}")
Mahmoodvcs

C # 6 dize enterpolasyon yolunda daha spesifik, kıvırcık gibi ikiye katlanır string v = $" foo {{{t}}}";. Eğer kıvırcık olmayan başka karakterleriniz varsa $ @ combostring v2 = $@"\foo {{{t}}}\";
Nhan

209

Evet çıktı {için string.Formatbu şekilde kaçmak zorunda{{

Yani bu

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

çıktı "foo {1,2,3}".

AMA C # 'daki bir tasarım hatası hakkında bilmek zorundasınız ki bu yukarıdaki mantığa girerek aşağıdaki kodun yazdırılacağını varsayalım {24.00}

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

Ama bu {N} yazdırıyor. Bunun nedeni, C #'ın kaçış dizilerini ayrıştırma ve karakterleri biçimlendirme biçimidir. Yukarıdaki durumda istenen değeri elde etmek için bunun yerine bunu kullanmanız gerekir.

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

Referans Makaleler String.Format gottach ve String Formatting FAQ


12
Eğer bu hata ile karşılaşırsam, string.Format( "{{{0}}}", i.ToString("N") );bazıları için daha okunabilir olabilir yazmak .
HappyNomad

1
@Happy Olabilir, ancak daha sonra farklı olanları belirtme veya bir tanesini kaçırma riskiyle kendinizi iki kez FormatProvider'ı belirtirken bulursunuz.
ClickRick

74

Neredeyse! Bir gergi için kaçış dizisidir {{veya }}bu nedenle örneğin istersek:

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

22

Sayfanızda yalnızca bir ayraç gösterecek çift açık ayraçlar ve çift kapanış ayraçlar kullanabilirsiniz.


13

Kıvrımlı parantezlerden kaçmak VE string enterpolasyonu kullanmak ilginç bir zorluk yaratır. Dize enterpolasyonu ayrıştırma ve ayrıştırma işleminden kaçmak için dörtlü ayraç kullanmanız gerekir .string.format

Kaçan Köşeli Ayraçlar: String Interpolation $ ("") ve 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>


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

veya bu şekilde c # string enterpolasyonunu kullanabilirsiniz (C # 6.0'da bulunan özellik)

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

1

Kaçan Köşeli Ayraçlar: String Interpolation $ (""):

Şimdi, bu şekilde c # string enterpolasyonunu da kullanabilirsiniz (C # 6.0'da bulunan özellik)

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

0

Hedefim:

"{CR}{LF}"Bir stringdeğişkene değer atamak gerekiyordu delimiter.

Kod c #:

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

Not: Normalde özel karakterlerden kaçmak için kullanmanız gerekir. Kıvrık ayracı {açmak için {{. Kıvrık ayracı kapatmak için}, bir tane daha kullanın}}.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.