Как избежать фигурных скобок в строке формата в .NET

Как избежать скобок при использовании string.Format.

Например:

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

В этом примере не создается исключение, но выводится строка foo {0}.

Есть ли способ избежать скобок?

Часто задаваемые вопросы о форматировании строк в MSDN msdn.microsoft.com/en-us/netframework/aa569608: Как записать фигурные скобки в строковых форматах? Есть ли у экранированных фигурных скобок какое-нибудь странное поведение, о котором мне нужно знать? Как я могу использовать форматирование строки, чтобы записать что-то вроде "{42.00}"?

gerryLowry 05.11.2011 13:30

К сожалению, указанная выше ссылка MSDN не работает. В настоящее время правильная ссылка выглядит как msdn.microsoft.com/en-us/library/… (перейдите в раздел QA внизу или выполните поиск по запросу «escape» на странице).

Palo Mraz 14.04.2017 08:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1 045
2
303 288
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Чтобы вывести 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}

"{{" рассматривается как символ экранированной скобки в строке формата.

icelava 18.09.2008 14:18

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

Nick 01.03.2013 21:24

Прочтите раздел Спасаясь от брекетов в официальной документации Составное форматирование.

Jeppe Stig Nielsen 07.04.2013 13:32

Он также работает в новой строковой интерполяции C# 6 ($"a = {{ {a} }}")

Mahmood Dehghan 03.04.2016 08:55

Более конкретно о способе интерполяции строк C# 6, удвоение фигурных элементов работает так, как string v = $" foo {{{t}}}";. Если вам нужно экранировать другие символы, которые не являются фигурными, вы можете использовать комбо $ @ string v2 = $@"\foo {{{t}}}\";.

Nhan 15.04.2016 01:04

Почти готово! Управляющая последовательность для фигурной скобки - {{ или }}, поэтому для вашего примера вы должны использовать:

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") );, который может быть более читаемым для некоторых.

HappyNomad 08.05.2014 07:25

@Happy Может быть, но тогда вы обнаружите, что указываете FormatProvider дважды, с риском, что вы укажете другие или пропустите один.

ClickRick 20.04.2015 12:02

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

Другие вопросы по теме