Подтвердить что ты не робот

Форматирование строк с помощью фигурных скобок

Я хочу вывести форматированное число внутри фигурных скобок (пример {$100.00}) с помощью инструкции string.Format(fmt, x) с x=100.

{ 
    var x = 100M;
    // works fine without a format specifier
    string.Format("{{{0}}}", x);    // "{100.00}"

    // fails with a format specifier
    string.Format("{{{0:C}}}", x);  // "{C}"

    // works with spaces
    string.Format("{{ {0:C} }}", x);  // "{ $100.00 }"
}

Итак, какую строку формата я должен использовать выше, чтобы получить {$100} без использования неуклюжего решения, такого как string.Format("{0}{1:C}{2}", "{", x, "}");

4b9b3361

Ответ 1

Попробуйте использовать этот код:

string.Format("{{{0}}}", x.ToString("C"))

Ответ 2

Это фактически документировано на MSDN в Composite Formatting:

То, как интерпретируются скрытые фигурные скобки, может привести к неожиданным результатам. Например, рассмотрим элемент формата "{{{0:D}}}", который предназначен для отображения открывающей скобки, числового значения, отформатированного как десятичное число, и закрывающей скобки. Однако элемент формата фактически интерпретируется следующим образом:

  • Первые две открывающиеся фигурные скобки ("{{") сбрасываются и дают одну открывающую скобу.
  • Следующие три символа ("{0:") интерпретируются как начало элемента формата.
  • Следующий символ ("D") будет интерпретироваться как спецификатор десятичного стандартного числового формата, но следующие две экранированные фигурные скобки ("}}") дают единую фигуру. Поскольку результирующая строка ("D}") не является стандартным спецификатором числового формата, результирующая строка интерпретируется как строка пользовательского формата, которая означает отображение литеральной строки "D}".
  • Последняя фигурная скобка ("}") интерпретируется как конец элемента формата.
  • Конечным результатом, который отображается, является буквальная строка, "{D}". Числовое значение, которое должно было быть отформатировано, не отображается.

Один из способов написать код, чтобы избежать неправильной интерпретации экранированных фигурных скобок и элементов формата, - это форматировать фигурные скобки и форматировать элемент отдельно. То есть, в операции первого формата отображается буквальная открывающая скобка, в следующей операции отображается результат элемента формата, а затем в финальной операции отображается буквальная закрывающая скобка. Следующий пример иллюстрирует этот подход.

int value = 6324;
string output = string.Format("{0}{1:D}{2}", 
                             "{", value, "}");
Console.WriteLine(output);
// The example displays the following output: 
//       {6324}

(обратите внимание, что я добавляю код только потому, что он ссылается в статье MSDN - не предлагать его в качестве решения.)

Если вас не интересуют различия в культуре, вы можете использовать "{{{0:$#,##0.00}}}" как строку формата.

Ответ 3

В зависимости от приложения вы можете использовать пространство нулевой ширины, чтобы обмануть string.Format метод в том, что вы хотите. См. Пространства в Юникоде для списка параметров, но \x200B добавит пространство с нулевой шириной в строку С#, чтобы вы могли попробовать использовать

string.Format("Pi is {{{0:N2}\x200B}} when rounded", Math.PI)

что должно привести к Pi is {3.14​} when rounded при отображении в приложении, поддерживающем unicode. Если приложение не поддерживает unicode, оно может выглядеть как Pi is {3.14​} when rounded