Convertirea tipurilor și clasa Convert
Metodele Parse și TryParse
Toate tipurile primitive au două metode care permit convertirea unei șiruri în tipul respectiv. Aceste metode sunt Parse() și TryParse().
Metoda Parse() acceptă ca parametru un șir de caractere și returnează un obiect de tipul curent. De exemplu:
int a = int.Parse("10");
double b = double.Parse("23,56");
decimal c = decimal.Parse("12,45");
byte d = byte.Parse("4");
Console.WriteLine($"a={a} b={b} c={c} d={d}");
Este de remarcat faptul că parsarea numerelor zecimale depinde de setările culturii curente. În special, pentru a obține un număr de tip double, am transmis șirul "23,56" cu virgulă ca separator.
Dacă aș fi transmis punct în loc de virgulă, aplicația ar fi generat o eroare de execuție. Pe calculatoarele cu o altă localizare, dimpotrivă, utilizarea virgulei în loc de punct ar fi generat o eroare.
Pentru a nu depinde de diferențele culturale, putem stabili un format clar folosind clasa NumberFormatInfo și proprietatea sa NumberDecimalSeparator:
using System.Globalization;
IFormatProvider formatter = new NumberFormatInfo { NumberDecimalSeparator = "." };
double number = double.Parse("23.56", formatter);
Console.WriteLine(number); // 23,56
În acest caz, separatorul este stabilit ca punct. Cu toate acestea, utilizând metoda Parse, putem întâlni potențial o eroare, de exemplu, în cazul transmiterii caracterelor alfabetice în locul celor numerice. În acest caz, o alegere mai bună ar fi utilizarea metodei TryParse().
Aceasta încearcă să convertească șirul într-un tip și, dacă conversia are succes, returnează true. În caz contrar, returnează false:
Console.WriteLine("Introduceți un șir:");
string? input = Console.ReadLine();
bool result = int.TryParse(input, out var number);
if (result == true)
Console.WriteLine($"Conversia a fost reușită. Număr: {number}");
else
Console.WriteLine("Conversia a eșuat");
Dacă conversia eșuează, nu va fi aruncată nicio excepție, pur și simplu metoda TryParse va returna false, iar variabila number va conține valoarea implicită.
Clasa Convert
Clasa Convert reprezintă o altă modalitate de a converti valorile. Pentru aceasta, în ea sunt definite următoarele metode statice:
- ToBoolean(value)
- ToByte(value)
- ToChar(value)
- ToDateTime(value)
- ToDecimal(value)
- ToDouble(value)
- ToInt16(value)
- ToInt32(value)
- ToInt64(value)
- ToSByte(value)
- ToSingle(value)
- ToUInt16(value)
- ToUInt32(value)
- ToUInt64(value)
Ca parametru, aceste metode pot accepta valori de diferite tipuri primitive, nu neapărat șiruri:
int n = Convert.ToInt32("23");
bool b = true;
double d = Convert.ToDouble(b);
Console.WriteLine($"n={n} d={d}");
Totuși, la fel ca în cazul metodei Parse, dacă metoda nu reușește să convertească valoarea la tipul dorit, va arunca o excepție FormatException.