.NET 2.0: Rýchlejšie parsovanie čísel

Veľmi častou úlohou pri programovaní je previesť text na číslo alebo dátum. Najčastejšie pri spracovaní vstupu od užívateľa, alebo spracovaní vystupných dát, ktoré nie sú „strongly typed“ (teda nenesú informácie o dátových typoch).

V .NET 1.0 a 1.1 sa používala načastejšie trieda Convert, ktorá obsahuje statické metódy pre konverziu medzi jednoduchými dátovými typmi (čísla, dátumy, logické hodnoty).

Problém nastáva v zložitom manažmente týchto konverzií. Ak sa totiž argument nedá previesť na daný dátový typ, tak vyhodia výnimku. Tzn. že celý blok kódu treba obaliť do try{} catch{}, ktoré zbytočne znižujú výkonnosť programu.

.NET 2.0 prináša nový prístup ku konverzii základných dátových typov. Je oveľa pohodlnejší a vyžaduje menej systémových prostriedkov. Stará koncepcia je totiž zlá – výnimky by sa mali používať naozaj vo výnimočnom prípade. Ak však užívateľ zadáva vo WinForm aplikácii do TextBoxu číslo a zadá ho zle, tak sa dosť časť nejde o výnimočný prípad ;-).

Preto existuje v .NET 2.0 v každom základnom dátovom type metóda TryParse(). Ako názov napovedá, metóda sa pokúsi spracovať zadaný vstup. Ak sa jej to podarí, vráti true, v opačnom prípade false. Čo však s konvertovanou hodnotou? Metóda má len návrtovú hodnotu bool… Použiť na vstupný text jednu z metód z Convert v bloku if() po úspešnom spracovaní textu metódou TryParse() by bolo jedno z riešení. Je vša neefektívne, pretože dochádza k dvojnásobnému spracovaniu vstupných dát.

Metóda TryParse() má parameter výstupný (out). Ide o premennú, do ktorej bude uložená skonvertovaná hodnota, ak bude konverzia úspešná. Toľko teória a teraz jeden jasný príklad:

int vek;
string input;

Console.Write(„Za­dajte Váš vek: ");

input = Console.ReadLine();

if (Int32.TryPar­se(input, out vek))
{
// správne zadané číslo, od dnešného datáumu odpočítame roky
DateTime rokNarodenia = DateTime.Toda­y.AddYears(-vek);

Console.Write­Line(“Narodili ste sa v roku {0}.„,
rokNarodenia.Year
);
}
else
{
Console.Write­Line(“Prosím, zadajte číslo.");
 }

Zdrojový kód programu: TryParse.cs.

Ukážku je možné vylepšiť o pridanie parametru NumberStyles.No­ne, ktorý neumožňí spracovaniezá­porného čísla. TryParse() by vyzeral takto:

Int32.TryParse(
    input,
    System.Globali­zation.Number­Styles.None,
    System.Globali­zation.Culture­Info.CurrentCul­ture.NumberFor­mat,
    out vek)

Paramater CurrentCulture­.NumberFormat podľa aktuálneho jazyka poskytne metóde informácie o kladnom, zápornom alebo desatinnom znamienku v číslach v aktuálnom jazyku (a aj ostatné dôležité informácie o číslach).

One thought on “.NET 2.0: Rýchlejšie parsovanie čísel

Comments are closed.