У C#/.NET є два основні механізми форматування рядків тексту (англ. string): використання String.Format() та інтерполяція рядків.
String.Format() приймає рядок тексту (у документації він зветься складеним форматом), що складається з фіксованого тексту та заповнювачів (у документації вони звуться елементами формату), а також змінну кількість аргументів. Повернене значення обчислює кожен елемент формату за допомогою відповідного аргументу й поєднує отримані значення з фіксованим текстом.
string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25));
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
Технічно цей механізм зветься складеним форматуванням.
Інтерпольовані рядки починаються зі знака $ і містять вирази, що обчислюються під час виконання, узяті у фігурні дужки. Елемент формату має такий синтаксис: $"{<interpolationExpression>}". Вони позбавляють потреби в окремому списку аргументів. Результат функціонально еквівалентний механізму String.Format().
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
Текст у фігурних дужках, тобто заповнювачі у випадку складеного формату й інтерпольовані вирази у випадку інтерполяції рядків, зветься елементом формату.
Елемент формату може складатися щонайбільше з 3 частин. Перша з них - обовʼязковий вираз або заповнювач аргументу, як у наведеному вище прикладі коду. Крім того, є необовʼязкове вирівнювання (вводиться комою «,») і необовʼязковий рядок формату (вводиться двокрапкою «:»).
{<interpolationExpression>[,<alignment>][:<formatString>]}
Вирівнювання задає довжину «поля», у якому розміщується текст; текст доповнюється пробілами ліворуч, якщо вирівнювання додатне, або праворуч, якщо воно відʼємне.
Рядок формату задає вигляд вихідного тексту: наприклад, чи включати розділювачі тисяч для числа або чи виводити лише частину з датою обʼєкта DateTime.
Наступний код показує, як вивести дату обʼєкта DateTime і число з плаваючою комою в експоненційній формі.
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
string.Format(
"I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
І для чисел, і для дат існує як стандартне, так і власне форматування. Між власним і стандартним форматуванням немає принципової різниці, хіба що ми маємо можливість складати власні рядки формату з літер формату.
Кожен потік має типову культуру Thread.CurrentThread.CurrentCulture, інкапсульовану в екземплярі CultureInfo. Культура потоку визначає, як форматувати дати й числа з урахуванням регіональних відмінностей, як-от різниця між звичним форматом дати у Великій Британії DD/MM/YYYY та у США MM/DD/YYYY.
CultureInfo реалізує інтерфейс IFormatProvider, який можна передати деяким перевантаженням String.Format(). Це дозволяє перевизначити культуру потоку.
Дослівні рядки дають змогу записувати багаторядкові рядки. Вони починаються з символу @.
string str = @"
See no wretched
quotes everywhere
";
У цій вправі ми допоможемо закоханим зі школи зізнатися в коханні одне одному в соцмережах.
Реалізуйте статичний метод HighSchoolSweethearts.DisplaySingleLine(), щоб він приймав два імені та показував їх, розділені сердечком.
Відформатований текст має бути завширшки 61 символ, а сердечко стояти в центрі рядка тексту (англ. string).
Усі імена гарантовано добре вміщуються в ширину рядка.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
Реалізуйте статичний метод HighSchoolSweethearts.DisplayBanner(), який показує два набори ініціалів, розділені знаком плюс.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
Реалізуйте статичний метод HighSchoolSweethearts.DisplayGermanExchangeStudents(), щоб показати дату початку стосунків і тривалість часу для наших німецьких школярів за обміном.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.