Lekce 4 - Textový výstup a složené formátování v C# Konzoli
V předešlém cvičení, Řešené úlohy k 1.-3. lekci Konzole C# .NET , jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním C# tutoriálu si ukážeme, jak pomocí metod třídy
Console
vypisovat text do okna konzole o něco efektivněji, než
jsme tak činili dosud. Co se týče výstupu, tak pro
konzolové aplikace platí jedno zásadní omezení. Okno konzole dokáže
vypsat pouze text. Většinu uživatelů takový výstup v
dnešní době neuspokojí, nicméně pro testování jednoduchých konzolových
aplikací je to postačující.
Pomocí metod a vlastností třídy Console
, určených pro
výstup, můžeme našim aplikacím umožnit:
- psát do okna konzole znaky různých znakových sad
- měnit barvu vypisovaného textu i pozadí
- posouvat kurzor po ploše okna, a také měnit jeho vlastnosti
Pro samotný výpis existují v zásadě dvě metody, a to
Write()
a WriteLine()
. S oběma jsme se už v
předchozích lekcích zaměřených na vstup znaků z
klávesnice setkali, ovšem zatím jsme je používali v jejich
nejjednodušší formě. V dnešním tutoriálu se podíváme na
vypisování textu pomocí metody Write()
.
Jak už víme z kurzu Základní konstrukce jazyka
C#. NET, metoda Write()
vypíše do okna konzole to, co
specifikujeme v závorkách. Může to být:
- řetězec znaků, který uzavřeme do uvozovek
- proměnná
- kombinace obojího
Pro zopakování uveďme příklad kombinace výpisu řetězců znaků a
proměnných. Všimněme si, že jednotlivé položky výpisu se propojují
znaménkem +
:
{CSHARP_CONSOLE}
int vek = 25;
int vaha = 86;
int vyska = 178;
Console.Write("Jan má " + vek + " let, váží " + vaha + " kg a měří " + vyska + " cm.");
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Jan má 25 let, váží 86 kg a měří 178 cm.
Složené formátování
V lekci Typový systém podruhé: Datové typy v C# .NET jsme se seznámili s jednoduchou formou složeného formátování. Ukažme si tedy, jak docílit stejného výsledku jako v předchozím případě pomocí složeného formátování:
{CSHARP_CONSOLE}
int vek = 25;
int vaha = 86;
int vyska = 178;
Console.Write("Jan má {0} let, váží {1} kg a měří {2} cm.", vek, vaha, vyska);
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Jan má 25 let, váží 86 kg a měří 178 cm.
Vidíme, že výsledek je shodný, nicméně použitím složeného formátování je kód kratší a přehlednější.
Ještě větší přehlednosti můžeme docílit nahrazením funkce složeného formátování interpolovaným řetězcem:
int vek = 25; int vaha = 86; int vyska = 178; Console.Write($"Jan má {vek} let, váží {vaha} kg a měří {vyska} cm.");
Výstup:
Konzolová aplikace
Jan má 25 let, váží 86 kg a měří 178 cm.
Interpolovaný řetězec je dostupný od verze C# 6.0.
Zástupné značky
Principem složeného formátování je vkládání
takzvaných zástupných značek
do řetězce, namísto kterých se
při výpisu zobrazí hodnoty proměnných, které jsou
vypsány za řetězcem v daném pořadí. Zástupné značky se
píšou do složených závorek a vždy začínají nulou. V
předchozím příkladu přísluší tedy proměnné vek
zástupná
značku {0}
, vaha
má zástupnou značku
{1}
a vyska
má zástupnou značku {2}
.
Zástupné značky se ale nemusí vypisovat v tom pořadí, v
jakém jsou číslovány. Např. {2}
může být volána před
{1}
, a také se na jednu proměnnou mohou odkazovat v textovém
řetězci vícekrát, například:
{CSHARP_CONSOLE}
string zena = "Eva";
string muz = "Jan";
string zvire = "koně";
Console.Write("{1} má {2}, {0} má taky {2}.", muz, zena, zvire);
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Eva má koně, Jan má taky koně.
Požadavek na zarovnání
Ve složených závorkách může být kromě samotné pozice zástupné značky i požadavek na zarovnání, který je oddělen čárkou. Ten se udává jako celé číslo, které reprezentuje počet znaků, na který se vypisovaná proměnná doplní mezerami. Je-li číslo záporné, proměnná se zarovná doleva, je-li kladné, zarovná se doprava. Toho využíváme v tabulkových výpisech.
Například v následujícím příkladu vyhradíme pro název nákladu 11 znaků a zarovnáme jej doleva, pro hmotnost vyhradíme 5 znaků a zarovnáme ji doprava:
string[] naklad = { "uhlí", "brambory", "dřevo", "písek" }; int[] hmotnost = { 20, 8, 34, 154 }; for (int i = 0; i < 4; i++) Console.Write("{0,-11} {1,5} tun\n", naklad[i], hmotnost[i]);
Výstup:
Konzolová aplikace
uhlí 20 tun
brambory 8 tun
dřevo 34 tun
písek 154 tun
Požadavek na formát
Kromě požadavku na zarovnání můžeme přidat do složených závorek
zástupných značek i požadavek na formát, v jakém se má
daná proměnná zobrazit. Jakékoliv číslo tak můžeme zobrazit v
šestnáctkové soustavě (specifikátor formátu
X
), ve vědeckém formátu jako číslo
× 10^n
(specifikátor formátu E
), nebo v
desítkové soustavě (specifikátor formátu
N
).
Specifikátor formátu se odděluje dvojtečkou. V
následujícím příkladu se vypíše jedno a to samé číslo reprezentované
zástupnou značkou {0}
ve formátu X
, E
a N
:
{CSHARP_CONSOLE}
int cislo = 56;
Console.Write("Číslo {0} ve formátu X={0:X}, E={0:E} a N={0:N}", cislo);
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Číslo 56 ve formátu X=38, E=5,600000E+001 a N=56,00
Všimněme si, že číslo v desítkové soustavě můžeme přímo zobrazit v šestnáctkové soustavě aniž bychom je museli převádět. Samotné číslo se nemění a zůstává uloženo v desítkové soustavě.
Specifikátor formátu N
pro desítkovou soustavu může být
následován celým číslem, které udává počet zobrazovaných desetinných
čísel, přičemž při zobrazování se zaokrouhluje. Opět ale platí, že
hodnota v proměnné cislo
se
nemění. Například:
{CSHARP_CONSOLE}
double cislo = 56.2356894;
Console.Write("Číslo {0} ve formátu N1={0:N1}, N2={0:N2}, N3={0:N3}, N4={0:N4}", cislo);
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Číslo 56,2356894 ve formátu N1=56,2, N2=56,24, N3=56,236, N4=56,2357
Úplné složené formátování
Samozřejmě, že zástupné značky mohou obsahovat jak požadavek na zarovnání, tak i požadavek na formát. To je výhodné při výpisu hodnot např. do tabulky. Má-li číslo méně desetinných míst, doplní se na požadovaný počet desetinných míst nuly. Má-li číslo více desetinných míst, zaokrouhlí se.
V následujícím příkladu pro každé zobrazované číslo reprezentované
zástupnou značkou {1}
vyhradíme 8 znaků,
zarovnáme je doprava a vypíšeme je s přesností na
dvě desetinná místa:
{CSHARP_CONSOLE}
double[] cislo = { 25.3, 189, 2.56698 };
for (int i = 0; i < 3; i++)
Console.Write("číslo {0} = {1,8:N2}\n", i, cislo[i]);
{/CSHARP_CONSOLE}
Stejně můžeme formátovat i interpolovaný řetězec. Zápis výše uvedeného příkladu by pak vypadal takto:
double[] cislo = { 25.3, 189, 2.56698 }; for (int i = 0; i < 3; i++) Console.Write($"číslo {i} = {cislo[i],8:N2}\n");
Výstup bude v obou případech stejný:
Konzolová aplikace
číslo 0 = 25,30
číslo 1 = 189,00
číslo 2 = 2,57
Ostatní specifikátory formátu
Specifikátorů formátu je samozřejmě více, než jsme
zatím uvedli. Jsou to například C
- specifikátor pro
měnu, P
– specifikátor pro
procenta, anebo celá skupina formátovacích značek pro
datum a čas.
Ukážeme si, jak je možno vypsat aktuální čas v
dlouhém formátu hh:mm:ss
(formátovací značka T
) a
v krátkém formátu hh:mm
(formátovací značka
t
):
{CSHARP_CONSOLE}
Console.Write("Aktuální čas T je: {0:T}", DateTime.Now);
Console.Write("\nAktuální čas t je: {0:t}", DateTime.Now);
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
Aktuální čas T je: 17:41:36
Aktuální čas t je: 17:41
Ve výše uvedeném příkladu si vyzkoušejte další
formátovací značky pro datum a čas, jako například d
,
dddd
, D
, f
, g
,
hh
, MMMM
.
V další lekci, Textový výstup a speciální znaky v C# Konzoli, si ukážeme směrování textového výstupu aplikací do okna konzole pomocí metody WriteLine() s použitím speciálních znaků a escapování.