Sitemap  · Français  · English  · Deutsch
Home » Blog » Artikel

Artikel

Dezimalzahl in ein anderes Zahlensystem umwandeln

15.02.2009
Unser geschätzter Freund und Partner von Excel4Managers regte vor kurzem die Entwicklung einer Excel VBA Funktion an, um eine Dezimalzahl in ein oder mehrere Zahlensysteme umzuwandeln. Gemeinsam überlegten wir, ob so eine Funktion nicht generell für jedes beliebige Zahlensystem erstellt werden könnte. Das Ergebnis möchten wir Ihnen im Folgenden vorstellen, einen korrespondierenden Artikel zu diesem Thema finden Sie auch bei Excel4Managers.de. Ein Beispielprojekt steht Ihnen zudem hier im Downloadbereich zur Verfügung.

Zunächst musste ein einfach umsetzbarer Algorithmus gefunden werden, der dies für verschiedene Basen ermöglicht. Über eine Recherche im Internet sind wir auf die Mathe-Seiten von Arndt Brünner gestossen, wo ein solches Verfahren für verschiedene Umrechnungen vorgestellt wird. Übrigens, Arndt Brünner erläutert viele interessante Problemstellungen der Mathematik anschaulich und mit vielen Beispielen, echt Klasse, diese Seite!

Zurück zu unserem Problem: die Umwandlung einer Dezimalzahl kann durch eine einfache iterative Restdivision für (fast) jede beliebige Basis ermittelt werden. Schauen wir uns folgenden Code genauer an:
Do
  
  If Zahl Mod Basis > 9 Then
    
    Ergebnis = Chr(55 + Zahl  Mod Basis) & Ergebnis 
    
  Else
    
    Ergebnis  = CStr(Zahl  Mod Basis) & Ergebnis 
    
  End If
    
    Zahl  = (Zahl  - (Zahl  Mod Basis)) / Basis
      
Loop While Zahl > 1
Die Variable 'Zahl' stellt am Anfang die Zahl im Dezimalsystem dar, die umgewandelt werden soll. Während der Schleife wird diese Zahl immer wieder aktualisiert, bis 'Zahl' einen Wert kleiner 2 einnimmt. Die Variable 'Ergebnis' ist eine Zeichenkette, der bei jeden Durchlauf der Schleife das Ergebnis der Restdivision vorangestellt wird. Hierbei ist auch zu beachten, dass eine Basis größer 9 auch entsprechende Zeichen benötigt, um die Stellen auch darstellen zu können. Zum Beispiel A, B, C, D, E und F bei Basis = 16. Wir lösen das im Code, indem wir bei einer Basis größer 9 uns aus dem Zeichenvorrat der ASCII-Tabelle bedienen.

Schön wäre auch eine Funktion, die eine Zahl in Basis X auch wieder in eine Dezimalzahl zurückzuverwandeln. Wenn wir z.B. die Zahl XYZ der Basis B nehmen, wobei X, Y, und Z die einzelnen Ziffern bzw. Zeichen der Zahl sind, gilt:
Dezimalzahl = X * B hoch 2 + Y * B hoch 1 + Z * B hoch 0
Im folgenden nun unser kompletter Code, der diese Umwandlungen in beide Richtungen ermöglicht. Wir haben die 2 Funktionen DECIMALTOBASE und BASETODECIMAL beigefügt, die zum Beispiel auch als Excel-Formel aufgerufen werden können. Wer mag, kann auch ein Excel Addin bauen und dieses dann verwenden. Der Code prüft rudimentär fehlerhafte Variablen.
'
' Copyright  : 2009 by Maninweb.de - www.excelsharp.de
'
' Version    : 0100
'
' Disclaimer : Sie können diesen Code in Ihren Projekten
'              frei verwenden.
'              Wir würden uns freuen, wenn Sie diesen
'              Hinweis auf den Autor beibehalten würden.
'
' .......................................................
    
' Optionen...
  
  Option Explicit
  
' Convert...
  
  Private Function mlfhDecimalToBase(Number As Long, _
                                     Base As Long) As String
    
    Dim n As Long
    Dim r As String
    
'   Initialize...
    
    n = Number
    
'   Loop...
    
    Do
      
'     Prepend...
      
      If n Mod Base > 9 Then
        
        r = Chr(55 + n Mod Base) & r
        
      Else
        
        r = CStr(n Mod Base) & r
        
      End If
      
'     Calculate...
      
      n = (n - (n Mod Base)) / Base
      
    Loop While n > 1
    
'   Prepend...
    
    If n > 0 Then
    
      r = CStr(n) & r
    
    End If
    
'   Result...
    
    mlfhDecimalToBase = r
    
  End Function
  
  Private Function mlfhBaseToDecimal(Number As String, _
                                     Base As Long) As Long
    
    Dim n As Long
    Dim r As Long
    
'   Loop...
    
    For n = Len(Number) To 1 Step -1
      
      If Asc(Mid(Number, n, 1)) > 64 Then
      
        r = r + Base ^ (Len(Number) - n) * ( _
                Asc(Mid(Number, n, 1)) - 55)
        
      Else
        
        r = r + Base ^ (Len(Number) - n) * _
                CLng(Mid(Number, n, 1))
        
      End If
      
    Next n
    
'   Result...
    
    mlfhBaseToDecimal = r
    
  End Function
  
' Worksheet function...
  
  Public Function DECIMALTOBASE(Value As Variant, _
                                Base As Variant) As String
    
    Dim n As Long
    Dim b As Long
    
'   Errors...
    
    On Error Resume Next
    
'   Check...
    
    n = CLng(Value)
    b = CLng(Base)
    
'   Check...
    
    If Err.Number <> 0 Then
    
      DECIMALTOBASE = "#ERROR"
    
    Else
      
      DECIMALTOBASE = mlfhDecimalToBase(n, b)
      
    End If
    
  End Function
  
  Public Function BASETODECIMAL(Number As Variant, _
                  Base As Variant) As Long
    
    Dim n As String
    Dim b As Long
    
'   Errors...
    
    On Error Resume Next
    
'   Check...
    
    n = CStr(Trim(Number))
    b = CLng(Base)
    
'   Check...
    
    If Err.Number <> 0 Then
    
      BASETODECIMAL = "#ERROR"
    
    Else
      
      BASETODECIMAL = mlfhBaseToDecimal(n, b)
      
    End If
    
  End Function

Unser Beispielprojekt Zahlensystemumwandlung mit VBA enthält nicht nur den Code, sondern auch eine Tabelle, wo Sie die Umwandlung direkt ausprobieren können. Sie sind herzlich eingeladen, den Code zu verbessern, zu optimieren oder einfach uns nur eine Rückmeldung zu geben. Weitere Links zu dem Thema finden Sie folgend aufgeführt…

» Excel4Managers.de mit interessanten Tipps & Tricks zu Excel, Deutsch
» Mathematik-Seiten von Arnd Brünner, Deutsch
» Wikipedia Seite zum Dualsystem, Deutsch