Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 +:

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.

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í:

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);

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:

string zena = "Eva";
string muz = "Jan";
string zvire = "koně";
Console.Write("{1} má {2}, {0} má taky {2}.", muz, zena, zvire);

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:

int cislo = 56;
Console.Write("Číslo {0} ve formátu X={0:X}, E={0:E} a N={0:N}", cislo);

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:

double cislo = 56.2356894;
Console.Write("Číslo {0} ve formátu N1={0:N1}, N2={0:N2}, N3={0:N3}, N4={0:N4}", cislo);

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:

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]);

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):

Console.Write("Aktuální čas T je: {0:T}", DateTime.Now);
Console.Write("\nAktuální čas t je: {0:t}", DateTime.Now);

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í.


 

Předchozí článek
Řešené úlohy k 1.-3. lekci Konzole C# .NET
Všechny články v sekci
Konzole C# .NET a její možnosti
Přeskočit článek
(nedoporučujeme)
Textový výstup a speciální znaky v C# Konzoli
Článek pro vás napsal Luděk Novotný
Avatar
Uživatelské hodnocení:
4 hlasů
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity