Як уникнути дужок (фігурних дужок) у рядку формату в .NET


988

Як уникнути дужок у використанні string.Format.

Наприклад:

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

Цей приклад не кидає винятку, але виводить рядок foo {0}.

Чи є спосіб уникнути дужок?


1
Поширені запитання щодо форматування рядків MSDN msdn.microsoft.com/en-us/netframework/aa569608 : Як виписати фігурну дужку у строкових форматах? Чи мають урятовані фігурні дужки якісь дивні форми поведінки, про які мені потрібно знати? Як я можу використовувати форматування рядків, щоб записати щось на кшталт "{42.00}"?
gerryLowry

1
На жаль, вищезазначене посилання MSDN розірвано. В даний час правильним посиланням здається msdn.microsoft.com/en-us/library/… (ввімкніть розділ QA внизу або шукайте "втечу" на сторінці).
Palo Mraz

Відповіді:


1283

Щоб вивести результат, foo {1, 2, 3}вам потрібно зробити щось на кшталт:

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

Для виведення a, який {ви використовуєте, {{і для виведення використовуваного }вами }}.

або Тепер ви також можете використовувати c # string interpolation, як ця (функція доступна в C # 6.0)

Вихідні дужки: Інтерполяція рядків $ ("") . це нова функція в C # 6.0

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

108
"{{" трактується як символ, що втік дужки, у рядку формату.
іслала

5
Але якщо ви хочете додати форматування значень до свого строкового специфікатора, вам також потрібно прочитати відповідь Гуру Кара нижче.
Нік

Прочитайте розділ Вихідні брекети в офіційній документації Композиційне форматування .
Джеппе Стіг Нільсен

8
Він також працює в новій інтерполяції рядків C # 6 ( $"a = {{ {a} }}")
Mahmoodvcs

Більш конкретно щодо інтерполяції рядків C # 6, подвоєння на фігурні працює так string v = $" foo {{{t}}}";. Якщо у вас є інші символи, щоб уникнути, що не є кучерявим, ви можете використовувати $ @ combostring v2 = $@"\foo {{{t}}}\";
Nhan

209

Так для виведення {в string.Formatвас є , щоб уникнути його , як це{{

Так це

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

виведе "foo {1,2,3}".

Але ви повинні знати про помилку дизайну в C #, що полягає в тому, що, виходячи з вищеописаної логіки, ви припускаєте, що цей код нижче буде надруковано {24.00}

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

Але це друкує {N}. Це тому, що спосіб C # аналізує втечу послідовностей та форматування символів. Щоб отримати бажане значення у наведеному вище випадку, вам слід скористатися цим.

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

Довідкові статті String.Format FAQ та форматування рядків


12
Якби я натрапив на цю помилку, я би написав, string.Format( "{{{0}}}", i.ToString("N") );який може бути читабельнішим для когось.
HappyNomad

1
@Happy Це може бути, але тоді ви опинитесь указуючи FormatProvider двічі, ризикуючи вказати різні або пропустити один.
ClickRick

74

Майже там! Послідовність виходу на скобі є {{або }}так для прикладу ви будете використовувати:

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

22

Ви можете використовувати подвійні відкриті дужки та подвійні дужки, що закриваються, які відображатимуть лише одну дужку на вашій сторінці.


13

Уникнення фігурних дужок І використання стрипової інтерполяції викликає цікаве завдання. Щоб уникнути розбору та розбору рядків з інтерполяцією рядків, потрібно використовувати чотириразові дужки .string.format

Вихідні дужки: Інтерполяція рядків $ ("") та 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

Сюди прийшли шукати, як створити строки json ad-hoc (без серіалізації класу / об’єкта) у C #. Іншими словами, як уникнути дужок та лапок під час використання інтерпольованих рядків у C # та " дослівно-рядкові літерали " (рядки з подвійним цитуванням із префіксом "@"), як ...

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

або ви можете використовувати c # string interpolation, як це (функція доступна в C # 6.0)

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

1

Скобки, що ухиляються: Інтерполяція рядків $ (""):

Тепер ви також можете використовувати c # string interpolation, як ця (функція доступна в C # 6.0)

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

0

Моя мета:

Мені потрібно присвоїти значення "{CR}{LF}"для stringзмінної delimiter.

Код c #:

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

Примітка. Щоб нормально уникати спеціальних символів, вам потрібно скористатися. Для відкриття фігурної дужки {використовуйте додатковий на зразок {{. Для закриття фігурної дужки} використовуйте одну додаткову}}.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.