Astăzi ne vom concentra pe conversia șirurilor de caractere în numere, o sarcină comună cu care vă veți întâlni în programare. În C#, adesea trebuie să convertim datele de tip string în numere, pentru a efectua calcule sau manipulări de date, iar de cele mai multe ori acele date vor proveni de la utilizatori care le introduc în interfețele grafice de utilizator, care colectează date de obicei ca string. Un TextBox obține textul introdus de utilizator ca string, chiar dacă acel text reprezintă un număr. Același lucru este valabil și pentru programele de consolă, am folosit deja Console.ReadLine() pentru a obține date de la utilizatori. Deci, venind ca string, tot trebuie să convertim uneori acele date în numere, și nu este la fel de ușor ca celelalte conversii pe care le-am văzut deja (implicite și explicite). Să examinăm câteva modalități de a face acest lucru, și când ați putea folosi fiecare dintre ele.
Funcția Parse:
Această funcție este simplă, dar aveți grijă: dacă șirul de caractere nu poate fi convertit, va arunca o excepție despre care vom învăța în viitor, însă momentan trebuie să știți doar că este un tip special de eroare, care, când nu este plasată într-o construcție specială numită bloc try-catch, poate face ca programul vostru să se blocheze:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
using
System;
namespace
BunaLume
{
class
Program
{
static void Main(string[] args)
{
string varstaText = "57";
try
{
int varstaNumar = int.Parse(varstaText);
Console.WriteLine(varstaNumar);
}
catch (FormatException)
{
Console.WriteLine("Numar invalid!");
}
Console.ReadLine();
}
}
}
|
Exemplul de mai sus funcționează, deoarece textul "57" poate fi convertit în numărul 57. Cu toate acestea, acesta va arunca o excepție care va fi prinsă de blocul catch, care va afișa un mesaj de eroare:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
using
System;
namespace
BunaLume
{
class
Program
{
static void Main(string[] args)
{
string varstaText = "cincizeci si sapte";
try
{
int varstaNumar = int.Parse(varstaText);
Console.WriteLine(varstaNumar);
}
catch (FormatException)
{
Console.WriteLine("Numar invalid!");
}
Console.ReadLine();
}
}
}
|
Acest lucru se întâmplă deoarece, deși pentru noi, oamenii, acele cuvinte înseamnă un număr, pentru compilator acest lucru nu e adevărat, din perspectiva lui ar putea fi un roman de dragoste. Imaginați-vă: dacă aș scrie acel text ca "cinci-zeci și șapte", ar schimba acest lucru reprezentare textuală a numărului în mintea voastră? Nu, desigur că nu, creierul vostru este capabil să înțeleagă că linia de unire poate fi ignorată. Compilatorul nu poate lua acest tip de decizii, prin urmare, dacă textul nu este reprezentarea exactă, identică, a unui număr, nu poate fi convertit în acel număr, punct.
Deoarece funcția Parse() poate fi folosită pe un int, pentru a converti string-ul într-un int, asta înseamnă că o putem apela și pe alte tipuri de date numerice, atunci când dorim să convertim textul în respectivele tipuri de date numerice: decimal.Parse(), double.Parse(), byte.Parse(), etc. Compilatorul va arunca o excepție și atunci când textul este o reprezentare corectă a unui număr, dar în afara intervalului permis al fiecărui tip de date numeric.
Funcția TryParse:
Această funcție convertește și ea șirurile de caractere în numere, dar în loc să arunce o excepție atunci când eșuează, returnează o valoare booleană, indicând dacă respectiva conversie a reușit sau nu. Arată așa:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
using
System;
namespace
BunaLume
{
class
Program
{
static void Main(string[] args)
{
string varstaText = "57";
bool resultatConversie = int.TryParse(varstaText, out int varstaNumar);
Console.ReadLine();
}
}
}
|
Știu că nu am vorbit încă despre parametrii out, dar nu vă îngrijorați cu asta încă. Aveți nevoie doar să înțelegeți acest lucru: funcția TryParse() returnează un rezultat boolean care indică dacă respectiva conversie a reușit sau nu, dar avem nevoie și de valoarea convertită în sine, și deoarece nu există o modalitate ușoară de a returna mai multe valori dintr-o funcție, obținem numărul convertit ca un parametru out, pe care apoi îl putem folosi ca și cum am fi declarat o variabilă normală.
Vom învăța în câteva lecții că deoarece TryParse() returnează un rezultat boolean, putem folosi acel rezultat în interiorul instrucțiunilor condiționale, ceva de genul acesta:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using
System;
namespace
BunaLume
{
class
Program
{
static void Main(string[] args)
{
string varstaText = "57";
if (int.TryParse(varstaText, out int varstaNumar))
{
Console.WriteLine(varstaNumar);
}
else
{
Console.WriteLine("Numar invalid!");
}
Console.ReadLine();
}
}
}
|
Clasa Convert:
Clasa Convert conține o mulțime de funcții pentru conversia între diverse tipuri de date, dintre care unele sunt potrivite pentru conversia șirurilor în tipuri numerice. O putem folosi astfel:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
using
System;
namespace
BunaLume
{
class
Program
{
static void Main(string[] args)
{
string varstaText = "57";
try
{
int varstaNumar = Convert.ToInt32(varstaText);
Console.WriteLine(varstaNumar);
}
catch (FormatException)
{
Console.WriteLine("Numar invalid!");
}
Console.ReadLine();
}
}
}
|
Probabil ați observat că utilizarea sa este identică cu cea a funcției Parse(), dar există o diferență între modul în care acestea gestionează conversiile: Convert.ToInt32() va converti și șirurile care au o valoare null, returnând 0.
Dacă ați observat că funcția folosește aliasul tipului de date, și nu cuvântul cheie al acestuia, bravo. Acest lucru înseamnă că dacă am dori să convertim într-un long, ar trebui să folosim Convert.ToInt64(), și așa mai departe. La fel ca funcțiile de parsare care pot fi folosite pe mai multe tipuri de date numerice, avem și funcții pentru conversia în mai multe tipuri de date numerice: Convert.ToDecimal(), Convert.ToSingle(), Convert.ToDouble(), și așa mai departe.
Ca începători, vă recomand să luați calea mai sigură și să folosiți funcția TryParse(), cel puțin până când vom învăța despre excepții, și cum putem să ne ocupăm corespunzător de ele.