Треки
/
C#
C#
/
Вправи
/
Шкільне кохання
Шкільне кохання

Шкільне кохання

Навчальна вправа

Вступ

Форматування рядків тексту

У 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
";

Вказівки

У цій вправі ми допоможемо закоханим зі школи зізнатися в коханні одне одному в соцмережах.

1. Показати імена пари, розділені сердечком

Реалізуйте статичний метод HighSchoolSweethearts.DisplaySingleLine(), щоб він приймав два імені та показував їх, розділені сердечком. Відформатований текст має бути завширшки 61 символ, а сердечко стояти в центрі рядка тексту (англ. string).

Усі імена гарантовано добре вміщуються в ширину рядка.

HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => "                  Lance Green ♡ Pat Riley                    "

2. Показати ініціали пари в сердечку з ASCII-графіки

Реалізуйте статичний метод HighSchoolSweethearts.DisplayBanner(), який показує два набори ініціалів, розділені знаком плюс.

HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
     ******       ******
   **      **   **      **
 **         ** **         **
**            *            **
**                         **
**     L. G.  +  P. R.     **
 **                       **
   **                   **
     **               **
       **           **
         **       **
           **   **
             ***
              *

3. Німецькі школярі за обміном почуваються як удома завдяки оголошенням, чутливим до локалі

Реалізуйте статичний метод 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"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
C# Exercism

Час розпочати Шкільне кохання?

Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.