Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0559: Umrechnen zwischen verschiedenen Zahlensystemen

 von 

Beschreibung 

Hiermit kann man zwischen verschiedenen Zahlensystemen umrechnen lasssen. z.B. vom Dezimalsystem in ein anderes. Oder vom 10-er-System in ein 14-er-System.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [4,25 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'---------- Anfang Projektdatei zahlumwandlung.vbp ----------
' Die Komponente 'Microsoft Windows Common Controls-2 6.0 (MSCOMCT2.OCX)' wird benötigt.

'-------- Anfang Formular "Form1" alias tranfer.frm  --------
' Steuerelement: Textfeld "Text1" (Index von 0 bis 3)
' Steuerelement: Textfeld "Text2"
' Steuerelement: UpDown Control "UpDown1" (Index von 0 bis 1)
' Steuerelement: Beschriftungsfeld "Label6"
' Steuerelement: Beschriftungsfeld "Label7"
' Steuerelement: Beschriftungsfeld "Label5"
' Steuerelement: Beschriftungsfeld "Label4"
' Steuerelement: Beschriftungsfeld "Label3"
' Steuerelement: Beschriftungsfeld "Label2"
' Steuerelement: Beschriftungsfeld "Label1"

'
'Autor: Jonathan Haas <Jonathan.Haas@epost.de>

Option Explicit

Function Systemumrechnung(zahl As String, vonsystem As Byte, _
  nachsystem As Byte) As String
    'Umwandlung von einem Zahlensystem in ein anderes.
    
    'Erstmal Zahl ins Dezimalsystem Umrechnen
    Systemumrechnung = vonzahlsystem(zahl, vonsystem)
    'Danach Zahl vom Dezimalsystem ins Zielsystem umrechen
    Systemumrechnung = zahlsystem(Systemumrechnung, nachsystem)
    
End Function


Function zahlsystem(zahl As String, system As Byte) As String
    'Umrechnen von einem Dezimalsystem in ein belibiges anderes System.
    
    Dim zähler As Long, f, i
    Dim potenz
    
    ' 1 addieren, sonst klappts nicht
    zahl = zahl + 1
    
    If system = 0 Then Exit Function
      
    '100 Stellen as Standardwert, lässt sich aber ändern.
    For i = 100 To 0 Step -1
        zähler = 0
        potenz = system ^ i
        For f = 1 To system         'Prüfen, ob die Ziffer verwendet werden kann
          If zahl - potenz > 0 Then 'Wenn ja, zum Zähler dazuaddieren
          zahl = zahl - potenz      'und von der Ursprungszahl abziehen
          zähler = zähler + 1
          End If
        Next
        
        'Diese Zeile fügt die Stelle hinzu.
        'Falls die Ziffer > 9 ist wird die Zahl mit der
        'Funktion tonumeric in einen Buchstaben konvertiert.
        zahlsystem = zahlsystem & tonumeric(zähler)
    
    Next
    
    Do While Left$(zahlsystem, 1) = "0"
    zahlsystem = Mid$(zahlsystem, 2)
    Loop
    
    If system = 1 And InStr(zahlsystem, "0") <> 0 Then
    zahlsystem = Mid(zahlsystem, 1, InStr(zahlsystem, "0") - 1)
    End If
    
End Function

Function vonzahlsystem(zahl As String, system As Byte) As Double
    'Umrechnen von einem belibiges anderes System in ein Dezimalsystem
    
    Dim zähler As Long, f, i
    
    Do While Left$(zahl, 1) = "0"
    zahl = Mid$(zahl, 2)
    Loop
    
    'Der nachfolgende Abschnitt prüft nur, ob die Zahl richtig angegeben wurde,
    'ist also nicht so wichtig.
    If zahl = "" Then zahl = 0
    For i = system To 61
        If i <> 1 And zahl Like "*" & tonumeric(CLng(i)) & "*" Then
            Label6.Caption = "Zahl fehlerhaft angegeben."
            Exit Function
        End If
    Next
    
    'Der folgende Code ist die eigentliche Umrechnung.
    'In der Funktion wird jede Ziffer mit der zugehörigen potenz
    '(system ^ (Len(zahl) - i))
    'multipliziert, und zum ergebnis dazuaddiert.
    
    'fromnumeric macht aus Buchstaben wieder Ziffern.
    
    For i = 1 To Len(zahl) Step 1
        vonzahlsystem = vonzahlsystem + fromnumeric(Mid$(zahl, i, 1)) * _
            system ^ (Len(zahl) - i)
    Next

    'Ist eigentlich eher nutzlos, da keine kommazahlen unterstüzt werden.
    vonzahlsystem = Int(vonzahlsystem)
    
End Function


'Wichtig:
'Es gilt: 10-35 = A-Z
'         36-61 = a-z
'Das heißt, wenn Sie vom 16ner System ins Dezimalsystem umrechnen
'wollen dürfen Sie nicht a2f schreiben, sondern müssen
'Großbuchstaben benutzen: A2F

Function tonumeric(zahl As Long) As String
    'Diese Funktionen machen aus einer Ziffer, die nicht mehr
    'in den raum von 0 - 9 passt einen Buchstaben.
    
    
    If zahl > 9 And zahl < 36 Then
        tonumeric = Chr(55 + zahl)      'Großbuchstaben verwenden
    ElseIf zahl > 9 Then
        tonumeric = Chr(97 - 36 + zahl) 'Kleinbuchstaben verwenden
    Else
    tonumeric = zahl                'Wenn die Zahl in den Raum von 0-9 passt,
                                    'keine konvertierung zum Buchstaben.
    End If
End Function

Function fromnumeric(zahl As String) As Long
    'Diese Funktionen machen aus einem Buchstaben, die
    'entsprechende Zahl
    
    Dim temp As Byte
    
    temp = Asc(zahl)
    If IsNumeric(zahl) Then
        fromnumeric = zahl             'Wenn es schon eine Zahl ist, keine Änderung
    ElseIf temp >= 65 And temp <= 90 Then
        fromnumeric = temp - 55        'Wenn es ein Großbuchstabe
    ElseIf temp > 91 And temp <= 97 + 25 Then
        fromnumeric = temp - (97 - 36) 'oder ein Kleinbuchstabe ist
    Else                            'dann Konvertierung zur Ziffer
        'Wenn es weder Groß- noch Kleinbuchstabe noch Zahl ist -> Fehler
        Goto err
    End If
    Exit Function
err:
    Label6.Caption = "Zahl fehlerhaft angegeben."
End Function

'Die folgenden Funktionen dienen dazu, die Werte von den
'Textboxen entgegenzunehmen und Fehler abzufangen
'Da sie nichts mit der Umrechnung zu tun haben sind sie unkommentiert.

Private Sub Text1_Change(Index As Integer)
    Dim temp
    On Error Goto err
    
    Label6.Caption = "Programm von Jonathan Haas"
    
    temp = vonzahlsystem(Text1(3).Text, Text1(2).Text)
    
    If Len(temp) < 16 Then
        Text1(0).Text = temp
    Else
        Label6.Caption = "Zu groß"
    End If
    
    If Text1(0).Text >= 1E+16 Then
        Label6.Caption = "Zahl zu groß"
    ElseIf Text1(0).Text = "0" Then
        Text2.Text = 0
    ElseIf Text1(1).Text > 62 Then
        Label6.Caption = "System zu groß"
    Else
        Text2.Text = zahlsystem(Text1(0).Text, Text1(1).Text)
    End If
    
here:
    If Label6.Caption = "Programm von Jonathan Haas" Then
        Label6.BackColor = RGB(128, 128, 128) 'alles OK
    Else
        Label6.BackColor = RGB(255, 0, 0) 'Fehler -> Hintergrund wird rot
    End If
    
    Exit Sub
err:
    Label6.Caption = err.Description
    Text2.Text = 0
    Resume here
End Sub

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
    If Index = 3 Then Exit Sub
    If Not IsNumeric(Chr(KeyAscii)) And Not KeyAscii = 8 Then KeyAscii = 0
End Sub

'--------- Ende Formular "Form1" alias tranfer.frm  ---------
'----------- Ende Projektdatei zahlumwandlung.vbp -----------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Martin am 24.08.2003 um 14:21

Die typischen Mängel, die ein Programm dieser Art für Mathematiker uninteressant machen: Weder negative noch Kommazahlen werden unterstützt. Aber sonst, gutes Programm.

Kommentar von Jonathan am 07.04.2003 um 17:44

Hi, du kannst einfach das Double durch ein String Ersetzen.
Nur in folgender Zeile müsstest du dann 'per Hand rechnen'

vonzahlsystem = vonzahlsystem + fromnumeric(Mid$(zahl, i, 1)) * system ^ (Len(zahl) - i)

Kommentar von Raphael Rochat am 06.04.2003 um 14:29

Beim umrechnen von einem beliebigen System ins 10er entsteht eine Double-Zahl. Wie kann man diese Funktion ändern um einen String zu erhalten? Dies würde es erlauben auch sehr lange Zahlen auf die Stelle genau umzurechnen.

Vielen Dank,
mfg

Kommentar von Jonathan am 02.04.2003 um 17:13

For i = 100 To 0 Step -1

Kein problem.
Ändere die 100 einfach in eine größere Zahl.

Kommentar von Thomas Tschager am 22.03.2003 um 18:31

Ich bräuchte dieses Programm für eine größere Zahl. Kannst du mir es umprogrammieren, sodass ich soviele wie möglich umrechnen kann??

Kommentar von Jonathan Haas am 21.12.2002 um 15:20

Der Code stammt garantiert nicht von dir!!!

Er ist zu 100% auf meinem Mist gewachsen!!! ;-)

Kommentar von Christof Rueß am 13.12.2002 um 23:54

der code stammt von mir!!