Интерполированная проблема форматирования строки - PullRequest
0 голосов
/ 28 мая 2018

Я несколько раз сталкивался с одной проблемой с интерполированными строками.

Рассмотрим следующий случай:

double number = 123.4567;
var str = $"{{{number:F2}}}"; //I want to get "{123.45}"
Console.WriteLine(str); // Will print "{F2}"

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

     ___pair____
    |           |
$"{{{number:F2}}}";

Теперь вы можете сделать следующее, чтобы разорвать escape-последовательность:

var str = $"{{{number:F2} }}"; // This will be "{123.45 }"

Обратите внимание насимвол пробела этот подход добавляет к выводу.(Не идеально)

Мой вопрос:

Допустим, я хочу использовать единственную интерполированную строку , чтобы получить именно вывод "{123.45}"

Возможно ли это вообще без хакерских действий, подобных приведенным ниже?

var s = $"{{{number:F2}{'}'}";

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Предполагая, что нет необходимости использовать именованную строку формата, вы можете использовать:

var s = $"{{{number:#.#0}}}";
0 голосов
/ 28 мая 2018

Это ожидаемое поведение интерполяции строк.Упоминается в этом документе Microsoft.Приведенный ниже контент взят только по ссылке Microsoft.

Открывающая и закрывающая скобки интерпретируются как начало и конец элемента формата.Следовательно, вы должны использовать escape-последовательность для отображения буквальной открывающей или закрывающей фигурной скобки.Укажите две открывающие скобки ("{{") в фиксированном тексте, чтобы отобразить одну открывающую скобку ("{"), или две закрывающие скобки ("}}"), чтобы отобразить одну закрывающую скобку ("}").Скобки в элементе формата интерпретируются последовательно в том порядке, в котором они встречаются.Интерпретация вложенных скобок не поддерживается.

Способ интерпретации выходных скобок может привести к неожиданным результатам.Например, рассмотрим элемент формата "{{{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}  
...