Introduktion till programmering med C# : Konvertering av datatyper
Innehållsförteckning
Del 6.
Konvertera data mellan olika datatyper
Det är väldigt vanligt att vi måste omvandla ett värde ifrån en typ till en annan för fortsatt bearbetning. Det kan till exempel vara att vi får inmatat en sträng som sedan behöver behandlas som ett tal eller datum innan vi kan till exempel spara det till en databas. I C# använder vi begreppet "casting" när vi gör om ifrån en typ till en annan. Casting finns i två olika varianter, implicit och explicit.
Implicit betyder att omvandlingen sker automatiskt och är säker. Vi förlorar ingen information.
Explicit betyder att vi måste manuellt tvinga ett värde ifrån en typ till en annan. Här kan en risk finnas att vi förlorar exakthet i vår information. Till exempel göra om ett double värde till ett int värde.
Genom att använda explicit casting så säger vi till C# kompilatorn att vi vet vad vi gör och vi är medvetna om riskerna och är villiga att acceptera dem.
Exempel 1:
Detta är tillåtet(implicit casting)
int i = 10;
double x = i;
resultat 10
En int är mindre än en double, så detta är helt ok att göra.
Mindre till större typ fungerar oftast utan någon åtgärd.
Exempel 2:
Detta är inte tillåtet
double i = 10.4;
int x = i;
Här försöker vi att tvinga ett värde ifrån en större typ att få plats i en mindre typ(double till int).
Här måste vi använda explicit(tvingad) konvertering.
Exempel 3:
double i = 10.4;
int x = (int)i;
resultat 10
Observera att vi sätter måltypen inom parenteser före värdet vi vill tvinga ner till en int.
Parenteserna kallas för cast operatorn
Konvertera med System.Convert
Ett annat alternativ än cast operatorn som vi kan använda System.Convert metoderna. Med hjälp av System.Convert metoderna kan vi konvertera till och från alla C# typerna, inklusive tal, boeleska, strängar och datum and tids värden.
Syntaxen är System.Convert.[Måltypen](värdet som ska omvandlas)
Exempel:
double i = 10.4;
int x = System.Convert.ToInt32(i);
resultat 10
Konvertera vad som helst till en sträng
Den absolut mest vanliga konvertering är att göra om värden till sträng representation. Den är så vanlig att .NET har byggt in en metod för detta i alla tillgängliga typer, metoden ToString().
Exempel:
int i = 10;
Console.WriteLine(i.ToString());
resultat 10
bool isActive = true;
Console.WriteLine(isActive.ToString());
resultat True
DateTime date = DateTime.Now;
Console.WriteLine(date.ToString());
resultat 2022-10-03 14:27:52
Konvertera strängar till tal eller datum
En annan väldigt vanligt omvandling är att omvandla en sträng till ett tal eller ett datum. För detta så finns det en Parse metod som inte alla men några typer har inbyggt.
Exempel 1:
int mileage = int.Parse("8740");
Console.WriteLine(mileage);
resultat 8740
Exempel 2:
DateTime registeredDate = DateTime.Parse("2018-01-10");
Console.WriteLine(registeredDate);
resultat 2018-01-10 00:00:00 // Tidsdelen är inte angiven därav midnatt.
Detta är ganska enkelt att arbeta med, men vad händer om vi i int.Parse() skickar in något som inte kan tolkas som heltal?
Exempel:
int mileage = int.Parse("Michael");
Console.WriteLine(mileage);
resultat Unhandled exception. System.FormatException: The input string 'Michael' was not in a correct format.
Undvik konverteringsfel
Hur kan vi undvika att få applikationen att krascha om vi skulle göra ovanstående misstag?
Genom att använda en annan parse metod, TryParse().
TryParse försöker att konvertera värdet och om det går bra så returnera metoden true annars false. För att kunna använda TryParse metoden så måste vi ange en variabel som skall innehålla det konverterade värdet med hjälp av out nyckelordet.
Exempel:
string mileage = "Michael";
int outputValue;
if (int.TryParse(mileage, out outputValue))
{
Console.WriteLine("Det gick bra, kolla värdet outputValue");
}
else
{
Console.WriteLine($"Det gick inte att konvertera värdet {mileage}");
}
Console.WriteLine(outputValue);