Ответ 1
Попробуйте использовать этот код:
string.Format("{{{0}}}", x.ToString("C"))
Я хочу вывести форматированное число внутри фигурных скобок (пример {$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, "}");
Попробуйте использовать этот код:
string.Format("{{{0}}}", x.ToString("C"))
Это фактически документировано на 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}}}"
как строку формата.
В зависимости от приложения вы можете использовать пространство нулевой ширины, чтобы обмануть 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