3. diel - Textový výstup do okna konzoly a zložené formátovanie
V predchádzajúcej lekcii, Analýza dát zo vstupu z klávesnice , sme sa dozvedeli, čo všetko možno zistiť zo zadávaných dát z klávesnice a ukázali sme si postupy, ako možno tieto informácie získať a nakladať s nimi.
V dnešnom C# tutoriálu si ukážeme, ako pomocou metód triedy
Console
vypisovať text do okna konzoly o niečo efektívnejšie,
než sme tak robili doteraz. Čo sa týka výstupu, tak pre
konzolové aplikácie platí jedno zásadné obmedzenia. Okno konzoly dokáže
vypísať iba text. Väčšinu užívateľov taký výstup v
dnešnej dobe neuspokojí, však pre testovanie jednoduchých konzolových
aplikácií je to postačujúce.
Pomocou metód a vlastností triedy Console
, určených pre
výstup, môžeme našim aplikáciám umožniť:
- písať do okna konzoly znaky rôznych znakových sád
- meniť farbu vypisovaného textu aj pozadie
- posúvať kurzor po ploche okna, a tiež meniť jeho vlastnosti
Pre samotný výpis existujú v zásade dve metódy, a to
Write()
a WriteLine()
. S oboma sme sa už v
predchádzajúcich lekciách zameraných na vstup znakov z
klávesnice stretli, avšak zatiaľ sme ich používali v ich
najjednoduchšej forme. V dnešnom tutoriálu sa pozrieme na vypisovanie
textu pomocou metódy Write()
.
Ako už vieme z kurzu Základná konštrukcia jazyka
C #. NET, metóda Write()
vypíše do okna konzoly to, čo
špecifikujeme v zátvorkách. Môže to byť:
- reťazec znakov, ktorý uzavrieme do úvodzoviek
- premenná
- kombinácia oboch
Pre zopakovanie uveďme príklad kombinácie výpisu reťazcov znakov a
premenných. Všimnime si, že jednotlivé položky výpisu sa prepájajú
znamienkom +
:
{CSHARP_CONSOLE}
int vek = 25;
int vaha = 86;
int vyska = 178;
Console.Write("Jan má " + vek + " rokov, váži " + vaha + " kg a meria " + vyska + " cm.");
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Jan má 25 rokov, váži 86 kg a meria 178 cm.
Zložené formátovanie
V lekcii Typový systém druhýkrát: Dátové typy v C# .NET sme sa zoznámili s jednoduchou formou zloženého formátovania. Ukážme si teda, ako docieliť rovnaký výsledok ako v predchádzajúcom prípade pomocou zloženého formátovania:
{CSHARP_CONSOLE}
int vek = 25;
int vaha = 86;
int vyska = 178;
Console.Write("Jan má {0} rokov, váži {1} kg a meria {2} cm.", vek, vaha, vyska);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Jan má 25 rokov, váži 86 kg a meria 178 cm.
Vidíme, že výsledok je zhodný, avšak použitím zloženého formátovanie je kód kratšie a prehľadnejšie.
Ešte väčšie prehľadnosti môžeme docieliť nahradením funkcie zloženého formátovania interpolovaným reťazcom:
int vek = 25; int vaha = 86; int vyska = 178; Console.Write($"Jan má {vek} rokov, váži {vaha} kg a meria {vyska} cm.");
výstup:
Konzolová aplikácia
Jan má 25 rokov, váži 86 kg a meria 178 cm.
Interpolovaný reťazec je dostupný od verzie C# 6.0.
Zástupné značky
Princípom zloženého formátovanie je vkladanie
takzvaných zástupných značek
do reťazca, namiesto ktorých sa
pri výpise zobrazia hodnoty premenných, ktoré sú vypísané
za reťazcom v danom poradí. Zástupné značky sa píšu do
zložených zátvoriek a vždy začínajú nulou. V
predchádzajúcom príklade prislúcha teda premenné vek
zástupná značku {0}
, vaha
má zástupnú značku
{1}
a vyska
má zástupnú značku {2}
.
Zástupné značky sa ale nemusí vypisovať v tom poradí, v
akom sú očíslované. Napr. {2}
môže byť volaná pred
{1}
, a tiež sa na jednu premennú môžu odkazovať v textovom
reťazci viackrát, napríklad:
{CSHARP_CONSOLE}
string zena = "Eva";
string muz = "Jan";
string zvire = "kone";
Console.Write("{1} má {2}, {0} má taky {2}.", muz, zena, zvire);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Eva má koňa, Jan má taky kone.
Požiadavka na zarovnanie
V zložených zátvorkách môže byť okrem samotnej pozície zástupné značky aj požiadavka na zarovnanie, ktorý je oddelený čiarkou. Ten sa udáva ako celé číslo, ktoré reprezentuje počet znakov, na ktorý sa vypisovanie premenná doplní medzerami. Ak je číslo záporné, premenná sa zarovná doľava, ak je kladné, zarovná sa doprava. Toho využívame v tabuľkových výpisoch.
Napríklad v nasledujúcom príklade vyhradíme pre názov nákladu 11 znakov a zarovnáme ho doľava, pre hmotnosť vyhradíme 5 znakov a zarovnáme ju doprava:
{CSHARP_CONSOLE}
string[] naklad = { "uhlie", "zemiaky", "drevo", "piesok" };
int[] hmotnost = { 20, 8, 34, 154 };
for (int i = 0; i < 4; i++)
Console.Write("{0,-11} {1,5} ton\n", naklad[i], hmotnost[i]);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
uhlie 20 tun
zemiaky 8 tun
drevo 34 tun
piesok 154 tun
Požiadavka na formát
Okrem požiadavky na zarovnanie môžeme pridať do zložených zátvoriek
zástupných značiek aj požiadavka na formát, v akom sa má
daná premenná zobraziť. Akékoľvek číslo tak môžeme zobraziť v
hexadecimálne (Špecifikátor formátu X
), vo
vedeckom formáte ako číslo × 10^n
(Špecifikátor formátu E
), alebo v desiatkovej
sústave (Špecifikátor formátu N
).
Špecifikátor formáte sa oddeľuje dvojbodkou. V
nasledujúcom príklade sa vypíše jedno a to isté číslo reprezentovanej
zástupnú značkou {0}
vo formáte X
, E
a N
:
{CSHARP_CONSOLE}
int cislo = 56;
Console.Write("Číslo {0} vo formáte X={0:X}, E={0:E} a N={0:N}", cislo);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Číslo 56 vo formáte X=38, E=5,600000E+001 a N=56,00
Všimnime si, že číslo v desiatkovej sústave môžeme priamo zobraziť v šestnástkovej sústave bez toho aby sme ich museli prevádzať. Samotné číslo sa nemení a zostáva uložené v desiatkovej sústave.
Špecifikátor formátu N
pre desiatkovú sústavu môže byť
nasledovaný celým číslom, ktoré udáva počet zobrazovaných desatinných
čísel, pričom pri zobrazovaní sa zaokrúhľuje. Opäť ale platí, že
hodnota v premennej cislo
sa
nemení. napríklad:
{CSHARP_CONSOLE}
double cislo = 56.2356894;
Console.Write("Číslo {0} vo formáte N1={0:N1}, N2={0:N2}, N3={0:N3}, N4={0:N4}", cislo);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Číslo 56,2356894 ve formátu N1=56,2, N2=56,24, N3=56,236, N4=56,2357
Úplné zložené formátovanie
Samozrejme, že zástupné značky môžu obsahovať ako požiadavka na zarovnanie, tak aj požiadavka na formát. To je výhodné pri výpise hodnôt napr. Do tabuľky. Ak má číslo menej desatinných miest, doplní sa na požadovaný počet desatinných miest nuly. Ak má číslo viac desatinných miest, zaokrúhli sa.
V nasledujúcom príklade pre každé zobrazované číslo reprezentovanej
zástupnú značkou {1}
vyhradíme 8 znakov,
zarovnáme je doprava a vypíšeme je s presnosťou na
dve desatinné miesta:
{CSHARP_CONSOLE}
double[] cislo = { 25.3, 189, 2.56698, 1896.356 };
for (int i = 0; i < 4; i++)
Console.Write("číslo {0} = {1,8:N2}\n", i, cislo[i]);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
číslo 0 = 25,30
číslo 1 = 189,00
číslo 2 = 2,57
číslo 3 = 1 896,36
Ostatné špecifikátory formáte
Špecifikátorov formátu je samozrejme viac, než sme
zatiaľ uviedli. Sú to napríklad C
- Špecifikátor pre
menu, P
- Špecifikátor pre
percenta, alebo celá skupina formátovacích značiek pre
dátum a čas.
Ukážeme si, ako je možné vypísať aktuálny čas v
dlhom formáte hh:mm:ss
(formátovacie značka T
) a v
krátkom formáte hh:mm
(formátovacie značka t
):
{CSHARP_CONSOLE}
Console.Write("Aktuálny čas T je: {0:T}", DateTime.Now);
Console.Write("\nAktuálny čas t je: {0:t}", DateTime.Now);
{/CSHARP_CONSOLE}
výstup:
Konzolová aplikácia
Aktuálny čas T je: 17:41:36
Aktuálny čas t je: 17:41