В 9 уроці була розглянута робота з рядками в Сі-Шарп, зараз же ми поговоримо про їх форматування. Потреба у форматуванні рядків виникає досить часто (наприклад певна кількість знаків після коми для числа, або дата в потрібному форматі і т.д.).
У Сі-Шарп задавати форматування володіють такі методи:
- System.String.Format
- Console.WriteLine
- StreamWriter.Write
- ToString
Методи WriteLine і Write використовуються для виведення інформації в консоль, і при цьому дають можливість відформатувати результат. Метод Format класу String призначений конкретно для форматування. Він повертає відформатований рядок. Різниці між самим форматуванням для цих методів немає. Форматування в методі ToString можна задати тільки для чисел і дат.
Загальна структура форматування рядків має наступний вигляд:
String.Format ( "рядок формату", arg0, arg1, ..., argn);
arg0 і arg1 тут - аргументи форматування (числа, рядки, дати, і т. д.), з яких в результаті буде створено нову відформатована рядок.
Рядок формату може містити звичайні символи, які будуть відображені в тому вигляді, в якому вони задані, і команди форматування. Команда форматування полягає в фігурні дужки і має наступну структуру:
{[Номер аргументу], [ширина]: [формат]}
За [номеру аргументу] вказується до якого аргументу буде застосовано даний команда (відлік аргументів починається з нуля).
[Ширина] задає мінімальний розмір поля.
[Формат] - специфікатор формату.
Параметри [ширина] і [формат] не є обов'язковими.
Приклад простого форматування:
string formattedString = string.Format ("Result is {0}", 5); // "Result is 5"
Тут на місце команди {0} підставляється 0-й аргумент.
int num1 = 5, num2 = 3;
string formattedString = string.Format ("{0} + {1} = {2}", num1, num2, num1 + num2); // "5 + 3 = 8"
Console.WriteLine (formattedString);
Console.ReadLine ();
Параметр "ширина"
Іноді необхідно відформатувати рядки, що містять числа, щоб вони були вирівняні по лівому або правому краю і мали однакову довжину. До числа, яке має менше символів, ніж значення ширини, будуть додані прогалини зліва (позитивна ширина) або праворуч (негативна ширина):
Console.WriteLine ( "Result is {0, 6}", 1.2789);
Console.WriteLine ( "Result is {0, 6}", 7.54);
Console.WriteLine ( "Result is {0, -6}", 1.2789);
Console.WriteLine ( "Result is {0, -6}", 7.54);
В результаті вийде, що в перших двох рядках числа вирівняні по правому краю, в двох інших по лівому:
Result is 1,2789
Result is 7,54
Result is 1,2789
Result is 7,54
Вбудовані формати числових даних
А тепер ми розглянемо параметр команди форматування після двокрапки - формат. Для числових аргументів визначено цілий ряд форматів, всі вони описані в таблиці 1. Майже для всіх форматів можна також задати точність. Наприклад, формат для чисел з фіксованою точкою «f» за замовчуванням виводить не більш двох знаків після точки. Щоб задати 4 знака - потрібно вказати після зазначення формату необхідне число, «f4».
Таблиця1
Спеціальний символ |
Формат |
Опис |
c/C |
Грошова одиниця |
Вказує кількість десяткових знаків |
d/D |
Цілі числа |
Вказує мінімальну кількість цифр. При необхідності додаються нулі |
e/E |
Експотенціальні числа |
Вказує кількість десякових знаків |
f/F |
Числа з фіксованою точкою |
Вказує кількість десяткових знаків |
g/G |
Формати e/E і g/G |
Викоритсовує більш короткий формат із двох: f/F и g/G |
n/N |
Числа з фіксованою точкой з відділенням груп розрядів |
Вказує кількість десяткових знаків |
p/P |
Відсотки |
Множить число на 100 і виводить із знаком відсотків. Вказує кількість десяткових знаків |
r/R |
Формат кругового перетвоення. Тільки фіксовна точка |
Форматує число в рядок таким чином, що його можно повторно перетворити назад без втрат точноссті |
x/X |
Шістнадцяткові числа |
Вказує мінімальну кількість цифр. При необхідності додаються нулі |
Приклад використання деяких з вбудованих форматів:
Console.WriteLine ("{0: c}", 5.50); // "5,50 грн."
Console.WriteLine ("{0: c1}", 5.50); // "5,5 грн."
Console.WriteLine ("{0: e}", 5.50); // "5,500000е +000"
Console.WriteLine ("{0: d}", 32); // "32"
Console.WriteLine ("{0: d4}", 32); // "0032"
Console.WriteLine ("{0: p}", 0.55); // "55,00%"
Призначений для користувача формат числових даних. У таблиці 1 були описані стандартні формати для числових даних, але іноді необхідно визначити певний власний формат. Щоб створити власні форматів використовуються спеціальні символи (Таблиця 2):
Таблиця 2
Спеціальный символ |
Значення |
0 |
Цифра або нуль |
# |
Цифра |
. |
Розділювач дробу |
, |
Розділювач тисяч |
% |
Відсоток |
e |
Експонента |
; |
Визначає розділи, які описують формати для додатніх, від’ємних чисел і нуля |
\ |
Екранування спеціальних символів. Дає можливість вставляти спец-символи як текст |
Приклад використання користувальницьких форматів:
Console.WriteLine ( "{0: 00000.000}", 1024.32); // "01024,320"
Console.WriteLine ( "{0: ####. ###}", 1024.32); // "1024,32"
Console.WriteLine ( "{0: ####. #}", 1024.32); // "1024,3"
Console.WriteLine ( "{0: #, ###. ##}", 1024.32); // "1 024,32"
Console.WriteLine ( "{0: ##%}", 0.32); // "32%"
Console.WriteLine ( "{0: <####. ###>; [####. ###]; нуль}", 1024.32); // "<1024,32>"
Console.WriteLine ( "{0: <####. ###>; [####. ###]; нуль}", -1024.32); // "[1024,32]"
Console.WriteLine ( "{0: <####. ###>; [####. ###]; нуль}", 0); // "нуль"
Тут варто відзначити, що якщо кількість цифр цілої частини числа більше ніж кількість символів «0» або «#» в форматі, ціла частина числа все одно буде виводитися повністю.
Вбудовані формати дати і часу
Для роботи з датою і часом існує окремий набір стандартних форматів. Дані формати наведені в таблиці 3:
Таблиця 3
Спеціальний символ |
Формат |
Приклад |
d |
Коротка дата |
30.06.2014 |
D |
Довгий формат дата |
30 червня 2014 р. |
t |
Короткий час |
22:30 |
T |
Довгий формат часу |
22:30:10 |
f |
Довга дата/короткий формат часу |
30 червня 2014 р. 22:30 |
F |
Довга дата/довгий формат часу |
30 червня 2014 р. 22:30:10 |
g |
Коротка дата/короткий формат часу |
30.06.2014 22:30 |
G |
Коротка дата/довгий формат часу |
30.06.2014 22:30:10 |
M/m |
Місяць і день |
червня 30 |
O/o |
Обернений |
2014-06-30T22:30:10.0000000 |
R/r |
RFC1123 |
Mon, 30 Jun 2014 22:30:10 GMT |
s |
Для сортування |
2014-06-30T22:30:10 |
u |
Локальне, в універсальному форматі |
2014-06-30 22:30:10Z |
U |
GMT |
30 червня 2014 р. 19:30:10 |
Y |
Рік і місяць |
Червень 2014 |
Console.WriteLine ("{0: d}", DateTime.Now); // "30.06.2014"
Console.WriteLine ("{0: D}", DateTime.Now); // "30 червня 2014 р."
Console.WriteLine ("{0: t}", DateTime.Now); // "2:57"
Console.WriteLine ("{0: T}", DateTime.Now); // "2:57:53"
Console.WriteLine ("{0: U}", DateTime.Now); // "29 червня 2014 р. 23:57:53"
Console.WriteLine ("{0: Y}", DateTime.Now); // "Червень 2014 р."
Призначений для користувача формат дати і часу
Як і у випадку з числовими даними, для дати і часу можна визначати для користувача формат. Для цього використовуються спеціальні символи, які наведені в таблиці 4 (на прикладі дати 30.06.2014 22: 30: 10.1234):
Таблиця 4
Спеціальний символ |
Значення |
Результат |
y |
Рік 0-9 |
4 |
yy |
Рік 00-99 |
14 |
yyyy |
Рік, 4 цифри |
2014 |
M |
Місяць 1-12 |
6 |
MM |
Місяць 01-12 |
06 |
d |
День 1-31 |
0 |
dd |
День 01-31 |
30 |
h |
Час 1-12 |
2 |
hh |
Час 01-12 |
10 |
H |
Час 1-24 |
22 |
H |
Час 01-24 |
22 |
m |
Хвилина 0-59 |
30 |
mm |
Хвилина 00-59 |
30 |
s |
Секунда 0-59 |
10 |
ss |
Секунда 00-59 |
10 |
f – ffffff |
Долі секунди |
12 (для ff) |
F-FFFFFF |
Долі секунди, якщо вони не дорівнюють 0 |
12 (для ff) |
MMM |
Скорочене ім’я місяця |
Черв |
MMMM |
Назва місяця |
Червень |
ddd |
Скорочена назва дня тижня |
Пн |
dddd |
назва дня тижня |
понеділок |
tt |
Маркер для "AM" і "PM" 12-годинного формату |
PM |
zz |
Зміщення часової зони, коротке |
+03 |
zzz |
Зміщення часової зони, повне |
+03:00 |
gg |
Ера |
A.D. |
: |
Роздільник часу |
22:30:10 |
/ |
Роздільник дати |
30.06.2014 |
\ |
Екранування |
Console.WriteLine ("{0: y yy yyy yyyy}", DateTime.Now); // "14 14 2014 2014"
Console.WriteLine ("{0: d dd ddd dddd}", DateTime.Now); // "30 30 Пн понеділок"
Console.WriteLine ("{0: M MM MMM}", DateTime.Now); // "6 06 Чер"
Console.WriteLine ("{0: HH.mm.ss dd-MMM-yyyy}", DateTime.Now); // "03.21.22 30-Jun-2014"
Console.WriteLine ("{0: z zz zzz}", DateTime.Now); // "+3 +03 +03: 00"
Форматування з використанням методу ToString
Всі правила форматування, описані вище, можуть бути використані в перевантаженому методі ToString для чисел і дат:
Console.WriteLine (DateTime.Now.ToString ("dd MMM yyyy")); // 30 Чер 2014
Регіональні параметри CultureInfo
У прикладі нижче поточний день виводиться з поточними настройками CultureInfo (російськими), з англійськими (англійська Сполучених Штатів), і з українськими:
У прикладі нижче поточний день виводиться з поточними настройками CultureInfo (російськими), з англійськими (англійська Сполучених Штатів), і з українськими:
Є масив дат (з часом) і масив температур, і вони відповідають один одному. Температури в масиві мають вигляд в форматі: «26.3 27.1 30 24.7 25». Необхідно вивести інформацію таким чином:
Чер 30 (Пн) 09:31> 26,3 ° C
Чер 30 (Пн) 10:31> 27,1 ° C
Чер 30 (Пн) 11:31> 30,0 ° C
Дробова частина температури повинна обов'язково бути довжиною в один знак, навіть якщо температура ціла.