Funksjoner for konvertering

From Apache OpenOffice Wiki
Jump to: navigation, search

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).
Personal tools