Строковая интерполяция C #: Документация функций двоеточия и точки с запятой

2

Я нашел этот ответ codegolf для теста FizzBuzz, и, немного изучив его, я понял, что понятия не имею, как он на самом деле работает, поэтому я начал исследовать:

for(int i=1; i<101;i++)
    System.Console.Write($"{(i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");

Я положил его в dotnetfiddle и установил, что первая часть работает следующим образом:

{(BOOL?0:i):#}

Когда BOOL имеет значение true, тогда условное выражение возвращает 0, иначе число.

Однако число не возвращается, если оно <> 0. Я предполагаю, что это работа из :# символов. Я не могу найти документацию по работе символов :#. Кто-нибудь может объяснить двоеточие/хэш или указать мне правильное направление?

Вторая часть:

{VALUE:;;Fizz}

Когда VALUE = 0 тогда ничего не печатается. Я предполагаю, что это определяется первым ; символ [конечный оператор]. Второе ; символ определяет "если VALUE <> 0 то печатать то, что за мной".

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

  • 1
    what other 'advanced' functionality exists in string interpolation that I may not be aware of? будет слишком широким, вы, вероятно, должны удалить это
  • 2
    Композитное форматирование
Показать ещё 6 комментариев
Теги:
interpolation
semicolon
colon

2 ответа

2

Спасибо всем комментаторам! Быстрый ответ.

Здесь определяется # (пользовательский спецификатор)

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--custom-specifier

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

The; определяется здесь (раздел Seperator):

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--section-separator

Точка с запятой (;) является спецификатором условного формата, который применяет различное форматирование к числу в зависимости от того, является ли его значение положительным, отрицательным или нулевым. Чтобы создать такое поведение, строка пользовательского формата может содержать до трех разделов, разделенных точками с запятой...

1

Все это описано в документации по интерполяции строк, особенно в разделе " Структура интерполированной строки", который включает в себя следующее:

{<interpolatedExpression>[,<alignment>][:<formatString>]}

вместе с более подробным описанием для каждого из этих трех разделов.

Часть строки формата этой структуры определена на отдельных страницах, где вы можете использовать стандартные и пользовательские форматы для числовых типов, а также стандартные и пользовательские форматы для типов даты и времени. Есть также опции для значений Enum, и вы даже можете создать свой собственный поставщик форматов.

Стоит взглянуть на документацию поставщика нестандартных форматов только потому, что это также приведет вас к типу FormattableString. Это не очень хорошо отражено в документации, но я понимаю, что этот тип теоретически может позволить вам избежать повторного разбора интерполированной строки для каждой итерации при использовании в цикле, что потенциально повышает производительность (хотя на практике нет разница в это время). Я уже писал об этом раньше, и я пришел к выводу, что MS нужно встроить это в структуру лучше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню