Funksjoner for konvertering
- Konvertering
- Strenger
- Dato og tid
- Filer og mapper
- Brukerdialoger
- Annet
Ved utregning skal alle operandene ha samme type. Selv om interpreteren konverterer alle operandene til den best egnede typen, kan en eksplisitt konvertere med funksjoner.
Et eksempel på slik (stilltiende) implisitt konvertering er:
Dim A As String Dim B As Integer B = 101 A = B
I uttrykket "A = B" blandes typer, da man forsøker å legge et heltall (B) inn i en string (A). Interpreteren konverterer derfor (implisitt) B til en string, slik at det er "101" som legges inn i A.
At dette er "risikabelt" illustreres under:
Dim A As String Dim B As Integer Dim C As Integer B = 2 C = 3 A = B + C
Vil strengen A få verdien "5" eller "2"+"3", altså en kobling som gir resultatet "23"? Ved bruk av varianter (variabler som ikke har typen angitt) er resultatene av og til uklare, som i:
Dim A Dim B Dim C B = 2 C = "3" A = B + C
A blir enten 2 + 3 = 5 (sum av to heltall), eller "2" + "3" = "23" (summen av to strenger).
Uforutsigbarhet er ikke ønskelig. En kan la være å bruke variant som datatype, altså alltid angi datatype. Og en kan bruke funksjoner for eksplisitt konvertering:
- CStr(v) gir en String
- CInt(v) gir en Integer
- CLng(v) gir en Long
- CSng(v) gir en Single
- CDbl(v) gir en Double
- CBool(v) gir en Boolean
- CDate(v) gir en Date
Det som skal konverteres (v) blir da etter "beste evne" konvertert.
Dim A As String Dim B As Integer Dim C As Integer B = 2 C = 3 A = CStr(B + C) ' gir "t" (heltallene adderes før konvertering) A = CStr(B) + CStr(C) ' gir "23" (tallene konverteres før de "adderes")
Konvertering kan også endre presisjon. Hvis v er et desimaltall vil CInt(v) ta bort desimalene, altså redusere presisjon. Den vil dog først avrunde, slik at CInt(4.2) blir 4 og CInt(-3.99) blir -4. Hvis v er et heltall vil CSng(v) og CDbl(v) ikke endre verdien slik at CDbl(4) blir 4.0.
Enkelte konverteringer blir meningsløse og vil avstedkomme feil (som bør handteres). Eksempel er CDate("test") eller CBool("test"). Ved å sjekke på forhånd kan disse unngås. Slike testfunksjoner er boolske:
- IsNumeric(v) sjekker om v er et tall
- IsDate(v) sjekker om v er en dato
- IsArray(v) sjekker om v er en tabell
Ofte brukes disse når man er usikker på om inndata er brukbare
Dim v If IsNumeric(brukerInput) Then v = brukerInput Else v = 0 MsgBox "Feil type data (skal være tall)" End If
For datatypen Date fins måter å gardere seg mot feil på. Ellers er det ikke alle har en slik is..() tester. En selvlaget boolsk tester er:
Function isBoolean( v ) As Boolean On Error Goto feilTakler: ' aktiver feiltakling Dim dummy As Boolean dummy = v ' dette kan gå galt! isBoolean = True ' gikk fint (hurra!) On Error Goto 0 ' deaktiver Exit Sub ' avslutt! feilTakler: isBoolean = False On Error Goto 0 ' deaktiver End Function
Den "risikable" del av denne testeren forsøker å legge den ukjente datatypen inn i en boolsk variabel "dummy". Hvis dette feiler startes feilTakler.
Content on this page is licensed under the Public Documentation License (PDL). |