Как избежать скобок при использовании string.Format.
Например:
String val = "1,2,3"
String.Format(" foo {{0}}", val);
В этом примере не создается исключение, но выводится строка foo {0}.
Есть ли способ избежать скобок?
К сожалению, указанная выше ссылка MSDN не работает. В настоящее время правильная ссылка выглядит как msdn.microsoft.com/en-us/library/… (перейдите в раздел QA внизу или выполните поиск по запросу «escape» на странице).





Чтобы вывести foo {1, 2, 3}, вам нужно сделать что-то вроде:
string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
Для вывода { используется {{, а для вывода } используется }}.
или Теперь вы также можете использовать интерполяцию строк C#, подобную этой (функция доступна в C# 6.0)
Экранирующие скобки: интерполяция строк $ (""). это новая функция в C# 6.0
var inVal = "1, 2, 3";
var outVal = $" foo {{{inVal}}}";
//Output will be: foo {1, 2, 3}
"{{" рассматривается как символ экранированной скобки в строке формата.
Но если вы хотите добавить форматирование значения к своему спецификатору строки, вам также необходимо прочитать ответ Гуру Кара ниже.
Прочтите раздел Спасаясь от брекетов в официальной документации Составное форматирование.
Он также работает в новой строковой интерполяции C# 6 ($"a = {{ {a} }}")
Более конкретно о способе интерполяции строк C# 6, удвоение фигурных элементов работает так, как string v = $" foo {{{t}}}";. Если вам нужно экранировать другие символы, которые не являются фигурными, вы можете использовать комбо $ @ string v2 = $@"\foo {{{t}}}\";.
Почти готово! Управляющая последовательность для фигурной скобки - {{ или }}, поэтому для вашего примера вы должны использовать:
string t = "1, 2, 3";
string v = String.Format(" foo {{{0}}}", t);
Вы можете использовать двойные открывающие скобки и двойные закрывающие скобки, которые будут отображать только одну скобку на вашей странице.
Да, чтобы вывести { в 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# разбирает escape-последовательности и символы форматирования. Чтобы получить желаемое значение в приведенном выше случае, вы должны использовать это вместо этого.
String.Format("{0}{1:N}{2}", "{", i, "}") //evaluates to {24.00}
Справочные статьи String.Format gottach и Форматирование строк: часто задаваемые вопросы
Если бы я столкнулся с этой ошибкой, я бы написал string.Format( "{{{0}}}", i.ToString("N") );, который может быть более читаемым для некоторых.
@Happy Может быть, но тогда вы обнаружите, что указываете FormatProvider дважды, с риском, что вы укажете другие или пропустите один.
[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);
}
Пришел сюда в поисках того, как создавать строки json ad-hoc (без сериализации класса / объекта) на C#. Другими словами, как избежать фигурных скобок и кавычек при использовании Интерполированные строки в C# и «дословные строковые литералы» (строки в двойных кавычках с префиксом '@'), например ...
var json = $@"{{""name"":""{name}""}}";
Избегание фигурные скобки И использование строковая интерполяция представляет собой интересную задачу. Вам нужно использовать четверные скобки, чтобы избежать синтаксического анализа строковая интерполяция и синтаксического анализа 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>
или вы можете использовать интерполяцию строк C#, подобную этой (функция доступна в C# 6.0)
var value = "1, 2, 3";
var output = $" foo {{{value}}}";
Моя цель:
Мне нужно было присвоить значение "{CR}{LF}" переменной stringdelimiter.
Код C#:
string delimiter= "{{CR}}{{LF}}";
Примечание. Для экранирования специальных символов обычно необходимо использовать. Чтобы открыть фигурную скобку {, используйте одну дополнительную, например {{. Для закрытия фигурной скобки} используйте одну дополнительную}}.
Экранирующие скобки: Интерполяция строк $ (""):
Теперь вы также можете использовать интерполяцию строк C#, подобную этой (функция доступна в C# 6.0)
var inVal= "1, 2, 3";
var outVal= $" foo {{{inVal}}}";
//Output will be: foo {1, 2, 3}
Часто задаваемые вопросы о форматировании строк в MSDN msdn.microsoft.com/en-us/netframework/aa569608: Как записать фигурные скобки в строковых форматах? Есть ли у экранированных фигурных скобок какое-нибудь странное поведение, о котором мне нужно знать? Как я могу использовать форматирование строки, чтобы записать что-то вроде "{42.00}"?