Seite 1 von 1

Base_Convert() mit beliebig vielen Stellen

Verfasst: 05.09.2007 15:01
von NicTheQuick
Hallo Leute!

Jemand wollte PI im Zwölfersystem wissen, deshalb hab ich ein kleines
Progrämmchen geschrieben, dass das auch hinkriegt. Mit der folgenden
Funktion ist es möglich zwischen den Zahlensystemen von 2 bis 36 zu
konvertieren. Dabei müssen die Zahlen als String vorliegen.

///Edit:
Nachkommastellen müssen mit dem Punkt '.' abgetrennt werden.

Viel Spaß damit:

Code: Alles auswählen

Procedure.s Base_Convert(Value.s, InBase.l = 10, OutBase.l = 2, nbDecimals.l = 100)
  Protected p.l, *c.Character, left.s, l.l, lout.s, Mod.l, out.s, rout.s, right.s, a.l
  
  *c = @Value
  While *c\c
    Select *c\c
      Case '0' To '9' : *c\c - '0' + 1
      Case 'a' To 'z' : *c\c - 'a' + 11
      Case 'A' To 'Z' : *c\c - 'A' + 11
      Case '.' ;do nothing
      Default : *c\c = 1
    EndSelect
    *c + SizeOf(Character)
  Wend
  
  p = FindString(Value, ".", 1)
  If p
    left = Left(Value, p - 1)
    right = Mid(Value, p + 1, Len(Value) - p)
  Else
    p = Len(Value)
    left = Value
    right = ""
  EndIf
  
  If left ;Vorkommateil
    While left <> ""
      Mod = 0 : *c = @left : out = ""
      While *c\c
        Mod = Mod * InBase + *c\c - 1
        l = Mod / OutBase
        If l Or out
          out + Chr(l + 1)
        EndIf
        Mod - (l * OutBase)
        
        *c + SizeOf(Character)
      Wend
      
      left = out
      lout = Chr(Mod + 1) + lout
    Wend
  Else
    lout = Chr(1)
  EndIf
  
  If right ;Nachkommateil
    a = 0
    p = Len(right)
    While right <> Chr(1) And a < nbDecimals
      *c = @right + (p - 1) * SizeOf(Character)
      p = 0 : Mod = 0 : out = ""
      While *c >= @right
        Mod + (*c\c - 1) * OutBase
        out = Chr((Mod % InBase) + 1) + out
        Mod / InBase
        *c - SizeOf(Character)
        p + 1
      Wend
      
      right = out
      rout + Chr(Mod + 1)
      a + 1
    Wend
  EndIf
  
  If rout : out = lout + "." + rout : Else : out = lout : EndIf
  
  *c = @out
  While *c\c
    Select *c\c
      Case 1 To 10 : *c\c + '0' - 1
      Case 11 To 36 : *c\c + 'A' - 11
      Case '.' ;do nothing
      Default : *c\c = '?'
    EndSelect
    *c + SizeOf(Character)
  Wend
  
  ProcedureReturn out
EndProcedure

Define s.s
Debug "Beispiel für 10 -> 2 und zurück"
s = Base_Convert("3.1415926535897932384626433832795028841971693993", 10, 2, 100)
Debug s
Debug Base_Convert(s, 2, 10, 100)
Debug "3.1415926535897932384626433832795028841971693993 (Original)"
Debug "Beispiel für 10 -> 36 und zurück"
s = Base_Convert("3.1415926535897932384626433832795028841971693993", 10, 36, 100)
Debug s
Debug Base_Convert(s, 36, 10, 100)
Debug "3.1415926535897932384626433832795028841971693993 (Original)"