VBA Tipp: Gepackte Dezimalzahlen einlesen

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich habe Daten, die als gepackte Dezimalzahlen im COBOL COMP-3-Format vorliegen und möchte diese in Gleitkommazahlen wandeln.

Lösung

Public Function DblComp3(C3 As String, Optional d As Long = 2) As Double
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Dim i As Long
   Dim myByte   As Byte
   Dim hiNibble As Byte
   Dim loNibble As Byte
   Dim res      As Double
 
   For i = 1 To Len(C3)
      myByte = Asc(Mid$(C3, i, 1))
      hiNibble = myByte \ 16
      loNibble = myByte Mod 16
      If i = Len(C3) Then                  ' lowest byte
         res = (res * 10) + hiNibble
         If loNibble = 13 Then res = -res  ' Hex "D" : negativ
      Else
         res = (((res * 10) + hiNibble) * 10) + loNibble
      End If
   Next
   DblComp3 = res / (10 ^ d)   ' Stellenzahl berücksichtigen
End Function

Aufruf

   Debug.Print DblComp3(Chr$(&H12) & Chr$(&H34) & Chr$(&H5D), 0)
   'ergibt: -12345


Weblinks