Začátečnický kurz .Net: Formátování řetězců

Na základě článku o konkatenaci jsme viděli, že je velmi důležité používat StringBuilder z důvodu výkonu. Zde uvidíme, jak formátovat řetězec, větu, tento formát je často používán.

Proč String Format?

Neřeknu vám, že je to výkonnější, naopak string.Format() stojí několik milisekund navíc podle jednoduchého testu ve srovnání s konkatenovanou větou:

string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";

//Používám Stopwatch pro měření času mého kódu
Stopwatch s = new Stopwatch();
//Spouštím Stopwatch
s.Restart();
for(int i=0; i < 100000; i++)
{
string mujZprava = string.Format("Ahoj {0} {1}, píšu vám, abych vás požádal o zaslání mého balíčku na {2}, {3} - {4} {5}",
                                   jmeno, prijmeni, adresa, cislo, psc, mesto);
}
//Zastavuji Stopwatch
s.Stop();
//Zobrazím výsledek
Console.WriteLine(String.Format("Čas: {0}", s.Elapsed));
s.Restart();
for(int i=0; i < 100000; i++)
{
string mujZprava = "Ahoj " + jmeno + " " + prijmeni + ", píšu vám, abych vás požádal o zaslání mého balíčku na " +
                     adresa + ", " + cislo + " - " + psc + " " + mesto;
}
s.Stop();
Console.WriteLine(String.Format("Čas: {0}", s.Elapsed));

//Výsledek:
//string.format -> Čas: 00:00:00.0378547
//konkatenace -> Čas: 00:00:00.0134245

Druhá část kódu je méně čitelná než první část kódu, všimli jste si, že používáme string.Format() místo konkatenace proměnných (pomocí +)?

string.Format() je dobrý zvyk, který je mnohem čitelnější, ale uvidíte později, že můžeme spravovat formát výstupu řetězce.

Jak vidíte, stačí vložit do složených závorek (nebo hranatých) {x} index hodnoty, která bude nahrazena, pozor na toto:

int i = 0;
int x = 100;
string.Format("Moje hodnota je {0}, zatímco x je rovna {1}", i, x);

//Výsledek:
//Moje hodnota je 0, zatímco x je rovna 100

//Není to totéž jako toto:

string.Format("Moje hodnota je {1}, zatímco x je rovna {0}", i, x);
//Výsledek:
//Moje hodnota je 100, zatímco x je rovna 0

V příkladu výše, na druhém řádku, je první index {1}, takže nebude brát i, protože i je na pozici nula (ano, v informatice vždy začínáme od nuly a ne od 1), pozice {1} je x, zatímco index {0} je hodnota na pozici nula, tedy i.

Rozumíte?

Shrnuji, je třeba se vyhnout takovýmto konkatenacím:

string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";
string mujZprava = "Ahoj " + jmeno + " " + prijmeni + ", píšu vám, abych vás požádal o zaslání mého balíčku na " +
                                      adresa + ", " + cislo + " - " + psc + " " + mesto;
Console.WriteLine(mujZprava);

//Výsledek:
//Ahoj Dupont Julie, píšu vám, abych vás požádal o zaslání mého balíčku na Rue de l'étoile, 10 - 75000 Paříž

Ale raději:

string jmeno = "Dupont";
string prijmeni = "Julie";
string adresa = "Rue de l'étoile";
string cislo = "10";
string psc = "75000";
string mesto = "Paříž";
string mujZprava = string.Format("Ahoj {0} {1}, píšu vám, abych vás požádal o zaslání mého balíčku na {2}, {3} - {4} {5}",
                                    jmeno, prijmeni, adresa, cislo, psc, mesto);
Console.WriteLine(mujZprava);

//Výsledek:
//Ahoj Dupont Julie, píšu vám, abych vás požádal o zaslání mého balíčku na Rue de l'étoile, 10 - 75000 Paříž

Další výhoda

Tady to začíná být zajímavější, díky string.Format() můžeme přímo formátovat hodnotu, jako takto:

int plat = 1000;
int hodinyPrace = 16;
string mujZprava = string.Format("Můj šéf mi platí {0:0.00}€ měsíčně za {1:0#} h práce denně.", plat, hodinyPrace);
Console.WriteLine(mujZprava);
//Můj šéf mi platí 1000,00€ měsíčně za 16 h práce denně.

hodinyPrace = 1;
mujZprava = string.Format("Můj šéf mi platí {0:0####.00}€ měsíčně za {1:0#} h práce denně.", plat, hodinyPrace);
Console.WriteLine(mujZprava);
//Můj šéf mi platí 01000,00€ měsíčně za 01 h práce denně.

mujZprava = string.Format("Jsme {0}", DateTime.Now);
Console.WriteLine(mujZprava);
//Jsme 23-04-19 16:53:54

mujZprava = string.Format("Jsme {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(mujZprava);
//Jsme 23-04-2019

Jak vidíte, můžeme přímo formátovat hodnotu, jak chceme, což by bylo delší při konkatenaci.

Další výhodou je, když vezmete větu z databáze nebo z resource souboru, ale tato věta musí pokaždé obsahovat různé hodnoty, stačí ji naformátovat takto:

//Zde bereme větu z resource souboru nebo dokonce z databáze
//je jedno odkud věta pochází, je to jen příklad
string.Format(resource.GetString("MojeVetaVMemResourceSouboru"), adresa, psč, město);

//MojeVetaVMemResourceSouboru = "Bydlím v {0}, PSČ {1}, město {2}"

Krátká varianta

Existuje ještě kratší verze string.Format() v C# 6 (Roslyn) od Visual Studio 2015 (je třeba přidat balíček Microsoft.Net.Compilers pro použití nových funkcí C#):

string mujZprava = string.Format("Jsme dne {0:dd-MM-yyyy}", DateTime.Now);
Console.WriteLine(mujZprava);
//Výsledek: Jsme dne 23-04-2019

mujZprava = $"Jsme dne {DateTime.Now:dd-MM-yyyy}";
Console.WriteLine(mujZprava);
//Výsledek: Jsme dne 23-04-2019

Druhý řádek představuje string.Format() trochu jinak, začínáme znakem $ (dolar) a poté je index, který byl nula v prvním řádku, přímo nahrazen a umístěn do složených závorek.

Specifikátor formátu Popis Příklady Výsledek
C nebo c Měna string s = $"{2.5:C}";

string s = $"{-2.5:C}";
$2.50

($2.50)
D nebo d Desetinné string s = $"{25:D5}"; 00025
E nebo e Exponenciální string s = $"{250000:E2}"; 2.50E+005
F nebo f Pevná čárka string s = $"{2.5:F2}";

string s = $"{2.5:F0}";
2.50

3
G nebo g Obecné string s = $"{2.5:G}"; 2.5
N nebo n Číselné string s = $"{2500000:N}"; 2,500,000.00
P nebo p Procento string s = $"{0.25:P}"; 25.00%
R nebo r Tam a zpět string s = $"{2.5:R}"; 2.5
X nebo x Hexadecimální string s = $"{250:X}";

string s = $"{0xffff:X}";
FA

FFFF

A mnoho dalších!

Pro více informací o string.Format() je zde dokumentace na webu Microsoft: https://docs.microsoft.com/fr-FR/dotnet/api/system.string.format?redirectedfrom=MSDN&view=netframework-4.8#System_String_Format_System_String_System_Object_

Při kompilaci se nic nemění, znak dolar je přeměněn na string.Format(), je to jen otázka zvyku, ale já to považuji za ještě čitelnější!

Aucun commentaire pour le moment.

Une erreur s'est produite. Cette application peut ne plus répondre jusqu'à ce qu'elle soit rechargée.Veuillez contacter l'auteur. Reload 🗙