Visual Basic/Typeconversie
Inleiding typeconversie
bewerkenHet kan gebeuren dat je een variabele wilt/moet converteren van een bepaald type naar een ander type. Zo levert de opdracht Console.ReadLine() altijd een string op, ook als naar een getal wordt gevraagd. Je moet dan de string expliciet converteren naar b.v. een integer. Dat doe je met de volgende constructie:
Dim getal As Integer getal = CInt(Console.ReadLine())
Maar ook tussen getallen kan conversie nodig zijn. Zo bevatten de typen Integer, Decimal, Long, Single, Double, enz. allemaal getallen, maar ook hier is conversie nodig of minstens aan te raden voor de duidelijkheid. Voorbeelden zijn b.v.:
Dim getal1 As Integer = 123 Dim getal2 As Double = 56.47 Dim getal3 As Single getal3 = CSng(getal1) getal1 = CInt(getal2)
In de tweede regel zie je dat je een decimale punt moet gebruiken. Als je het programma schrijft, moet je altijd een decimale punt gebruiken. Het is nu eenmaal Engels. Maar als je hetzelfde getal intypt bij een Console.ReadLine() én je Windows hebt ingesteld op Nederlands, moet je een komma gebruiken in plaats van een punt. Een beetje verwarrend, maar dit laat het verschil zien tussen het schrijven van een programma en de uitvoering ervan.
In de laatste regel wordt de inhoud van getal2 afgerond tot 56. Dit gebeurt steeds als een getal met cijfers na de komma wordt geconverteerd naar een geheel getal (Byte, Short, Integer, UInteger, Long, ULong). Hierbij wordt het bankiersalgoritme gebruikt. Dat houdt in dat alle getallen normaal worden afgerond, behalve getallen die precies 0,5 achter de komma hebben. Die worden afgerond op het meest nabijgelegen even getal. Zo levert de conversies van 3,5 en 4,5 allebei de waarde 4 op. Denk hier goed aan!!
Je kunt dit voorkomen door de functie Round te gebruiken om b.v. een Double waarde af te ronden. Hierbij kun je opgeven hoe het getal moet worden afgerond. Het resultaat is weer een Double, dus je moet ook nog CInt() gebruiken om er een geheel getal van te maken. Gebruik de volgende constructie:
Dim getal1 As Integer Dim getal2 As Double = 4.5 getal1 = CInt(Round(getal2, MidpointRounding.AwayFromZero))
Het is een beetje ingewikkeld. Door de binnenste haakjes wordt eerst getal2 afgerond (Round) en daarna door de buitenste haakjes geconverteerd naar een Integer (CInt).
Conversiefuncties
bewerkenVisual Basic kent een aantal conversiefuncties. Iedere functie converteert een willekeurige expressie naar een bepaald type. Zo nodig vindt er afronding plaats. De conversiefuncties zijn:
CBool(expressie) CBYte(expressie) CChar(expressie) CDate(expressie) CDbl(expressie) CDec(expressie) CInt(expressie) CLng(expressie) CObj(expressie) CSByte(expressie) CShort(expressie) CSng(expressie) CStr(expressie) CUInt(expressie) CULng(expressie) CUShort(expressie)
De naam van een conversiefuctie bestaat uit een C gevolgd door de afkorting van het type waarnaar geconverteerd moet worden.
Let op dat conversies naar een geheel getal gebruik maken van het bankiersalgoritme (zie hierboven).
Ter verduidelijking volgen hier enige voorbeelden:
Onderstaand voorbeeld gebruikt de functie CBool om een expressie te converteren naar een Boolean waarde. Als een expressie de waarde 0 oplevert, is het resultaat False en anders True.
Dim A, B, C As Integer Dim resultaat As Boolean A = 5 B = 5 resultaat = CBool(A = B) ' resultaat is True ' ... C = 0 resultaat = CBool(C) ' resultaat is False
Onderstaand voorbeeld gebruikt de functie CByte om een expressie te converteren naar een Byte waarde.
Dim varDouble As Double Dim varByte As Byte varDouble = 125.5678 varByte = CByte(varDouble) ' varByte krijgt de waarde 126 (let op ' de afronding).
Onderstaand voorbeeld gebruikt de functie CChar om het eerste teken van een string te converteren naar een Char waarde.
Dim varString As String Dim varChar As Char varString = "BCD" ' CChar converteert alleen het eerste teken. varChar = CChar(varString) ' varChar krijgt de waarde "B".
Het argument van CChar moet een string zijn. Het argument kan geen numeriek type zijn (b.v. Integer of Long).
Onderstaand voorbeeld gebruikt de functie CDate om een string te converteren naar een datum. De eerste twee regels converteren een string naar een datum, de twee regels daarna een literal.
Dim varDatumString, varTijdString As String Dim varDatum, varTijd As Date varDatumString = "March 12, 2015" varTijdString = "4:35:37 PM" ' converteer van string naar datum varDatum = CDate(varDatumString) varTijd = CDate(varTijdString) ' conveteren van literal naar datum varDatum = CDate(#Feb 12, 2015#) varTijd = CDate(#5:12:23 AM#)
Onderstaand voorbeeld gebruikt de functie CDbl om een expressie te converteren naar een Double waarde.
Dim varDec As Decimal Dim varDouble As Double varDec = 234.456784D ' de D achter het getal geeft aan dat dit ' een Decimal is varDouble = CDbl(varDec) ' Converteer varDec naar Double
Onderstaand voorbeeld gebruikt de functie CDec om een numerieke waarde te converteren naar een Decimal waarde.
Dim varDouble As Double Dim varDecimal As Decimal varDouble = 10000000.0587 varDecimal = CDec(varDouble) ' converteer varDouble naar een ' Decimal waarde
Onderstaand voorbeeld gebruikt de functie CInt om een numerieke waarde te converteren naar een Integer waarde.
Dim varDouble As Double Dim varInt As Integer varDouble = 2345.5678 varInt = CInt(varDouble) ' rond varDouble af en converteer ' het resultaat naar een Integer waarde. Het ' resultaat is 2346
Onderstaand voorbeeld gebruikt de functie CLng om een numerieke waarde te converteren naar een Long waarde.
Dim varDbl1, varDbl2 As Double Dim varLong1, varLong2 As Long varDbl1 = 25427.45 varDbl2 = 25427.55 varLong1 = CLng(varDbl1) ' rond varDbl af en converteer het resultaat naar een Integer waarde. Het resultaat is 25427 varLong2 = CLng(varDbl2) ' rond varDb2 af en converteer het resultaat naar een Integer waarde. Het resultaat is 25428
Onderstaand voorbeeld gebruikt de functie CObj om een numerieke waarde te converteren naar een Object waarde. Dit object bevat een pointer naar de waarde. Naast een numerieke waarde kunnen alle mogelijke waarden (string, char, boolean, datum) worden omgezet naar een Object.
Dim varDouble As Double Dim varObject As Object varDouble = 2.7182818 varObject = CObj(MvarDouble) ' varObject is een pointer naar een ' Double met de waarde 2.7182818
Onderstaand voorbeeld gebruikt de functie CShort om een numerieke waarde te converteren naar een Short waarde.
Dim varByte as Byte Dim varShort as Short varByte = 100 varShort = CShort(varByte) ' coverteer de waarde in varByte naar Short
Onderstaand voorbeeld gebruikt de functie CSng om een numerieke waarde te converteren naar een Single waarde. Let erop dat bij een conversie van b.v. Double naar Single een verlies van minder significante cijfers kan optreden.
Dim varDouble1, varDouble2 As Double Dim varSingle1, varSingle2 As Single varDouble1 = 75.3421105 varDouble2 = 75.3421567 varSingle1 = CSng(varDouble1) ' varSingle1 krijgt de waarde 75.34211 varSingle2 = CSng(varDouble2) ' varSingle2 krijgt de waarde 75.34216
Onderstaand voorbeeld gebruikt de functie CStr om een numerieke waarde te converteren naar een String waarde.
Dim varDouble As Double Dim varString As String varDouble = 437.324 varString = CStr(varDouble) ' MyString krijgt de waarde "437.324".
Onderstaand voorbeeld gebruikt de functie CStr om een datum te converteren naar een String waarde.
Dim varDate As Date Dim varString As String ' een datum-literal moet in de vorm #m/d/yyyy# zijn varDate = #2/12/69 00:00:00# ' de tijd is precies middernacht ' als de tijd precies 0 is (middernacht), komt de tijd niet voor ' in de String varString = CStr(varDate) ' varString krijgt de waarde "2/12/1969". ' ... varDate = #2/12/69 00:00:01# ' de tijd is nu niet middernacht ' in dit geval wordt de tijd meegenomen in de conversie varString = CStr(varDate) ' varString krijgt de waarde ' "2/12/1969 12:00:01 AM".
CStr zet een datum altijd om in de korte notatie volgens de taalinstellingen van Windows, bijvoorbeeld: "6/15/2003 4:35:47 PM".
De functie CType()
bewerkenDeze functie converteert een expressie naar een opgegeven type. Het formaat is:
CType(expressie, typenaam)
Hierbij is expressie een geldige expressie; als de waarde buiten het bereik van typenaam valt, treedt er een fout op.
typenaam is één van de typen die je in een Dim-statement kunt gebruiken, dus Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong en UShort.
CType() is geen echte functie, maar wordt door de compiler vertaald, zodat deze conversie over het algemeen sneller is dan andere conversie-methoden.
Voorbeeld:
Dim getal1 As Long = 123 Dim getal2 As Integer getal2 = CType(getal1, Integer)
De functie ToString
bewerkenIeder object heeft een methode ToString. Deze methode zet, afhankelijk van het soort object, de naam of de inhoud om naar een String. Op deze manier kun je alle datatypen omzetten naar een string, b.v.:
Dim getal1 As Integer = 123 Dim getal2 As Double = 12.45 Dim tekst As String tekst = getal1.ToString & " " & getal2.ToString