Hi,
wie sicher ein paar von euch mitbekommen haben hatte ich vor einer kleinen Weile einen Dezimal- zu Binärumrechner der das Horner-Schema benutzt vorgestellt.
Dann fiel mir ein, das man so ziemlich alles mit dem Horner-Schema von Dezimalzahlen zu dem Zahlensystem umwandeln kann, wenn man das System geordnet in einem Array anspricht (Source-Code!)
Nach kurzer Überlegung hab ich mich auch an die Arbeit gemacht und das Script endlich fertig geschrieben!
Mit NumberConvert.au3 ist es nun möglich:
Jedes Zahlensystem in jedes andere zu konvertieren und somit nicht mehr auf die einzelnen Funktionen wie z.B. Dec / Hex nutzen zu müssen (auch wenn sie natürlich noch andere Sachen machen.)
Ich hab zu der UDF noch paar globale und konstante Variablen hinzugefügt die folgendermaßen heißen:
Global Const $NS_DEC = "0-1-2-3-4-5-6-7-8-9", _
$NS_HEX = "0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F", _
$NS_BIN = "0-1", _
$NS_OCT = "0-1-2-3-4-5-6-7", _
$NS_ABC = "A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z"
Diese dienen dazu um nicht für jedes System ständig die Ziffern / Buchstaben schreiben zu müssen.
Wenn ihr die Funktion
_NumberConvert($sValue, $sNSystemFrom, $sNSystemTo)
aufruft, dann funktioniert das so:
_NumberConvert($sValue, $sNSystem1, $sNSystem2)
; $sValue ist der Wert / Zahl / Buchstabe den ihr konvertieren möchtet.
; $sNSystemFrom ist das Zahlensystem von dem ihr "weg"-konvertieren möchtet.
; $sNSystemTo ist das Zahlensystem in das ihr $sValue konvertieren wollt.
Natürlich ist die Funktion langsamer als z.B. Dec / Hex aber sie bietet viele und vorallem individuelle Konvertierungsmöglichkeiten.
Die Langsamheit der Funktion setzt sich daraus zusammen, das erst von $sNSystemFrom zum Dezimalsystem konvertiert wird und danach vom Dezimalsystem zum $sNSystemTo konvertiert wird.
Es wird ein Array mit 10.000 Plätzen erstellt, d.h. die maximale Grenze des von und hin Konvertierens liegt bei 10.000.
Grenze aufgehoben, das Array mit den Plätzen ist jetzt so groß wie die Eingabe wenn ihr die 2. Version ohne Errorhandling nutzt!
So, kommen wir endlich zur UDF, besser zu den Variablen und der Funktion
Global Const $NS_DEC = "0-1-2-3-4-5-6-7-8-9", _
$NS_HEX = "0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F", _
$NS_BIN = "0-1", _
$NS_OCT = "0-1-2-3-4-5-6-7", _
$NS_ABC = "A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z"
Func _NumberConvert($sValue, $sNSystemFrom, $sNSystemTo)
If $sNSystemFrom = $sNSystemTo Then
Return $sValue
ElseIf StringInStr($sNSystemFrom, $sValue) = False Then
Return 0
EndIf
Local $sReturn, $bSign, $iDec, $iToCap, $iExponent = -1, $fTmp
If StringLeft($sValue, 1) = "-" Then
$bSign = True
$sValue = StringTrimLeft($sValue, 1)
EndIf
Local Const $S_NS_FROM = StringReplace($sNSystemFrom, "-", ""), _
$A_NS_FROM = StringSplit($sNSystemFrom, "-", 2), _
$A_NS_TO = StringSplit($sNSystemTo, "-", 2), _
$A_VALUE = StringSplit($sValue, "", 2)
Local $A_NS_DEC[10000]
For $i = 0 To 9999
$A_NS_DEC[$i] = $i
Next
For $i = 0 To UBound($A_VALUE) - 1
$iDec += $A_NS_DEC[StringInStr($S_NS_FROM, $A_VALUE[$i])-1] * UBound($A_NS_FROM) ^ (UBound($A_VALUE) - 1 - $i)
Next
Do
$sReturn = $A_NS_TO[Mod($iDec, UBound($A_NS_TO))] & $sReturn
If $iDec / UBound($A_NS_TO) <> Int($iDec / UBound($A_NS_TO)) Then
$iDec = Int($iDec / UBound($A_NS_TO))
Else
$iDec /= UBound($A_NS_TO)
EndIf
Until $iDec = 0
If $bSign = True Then $sReturn = "-" & $sReturn
Return $sReturn
EndFunc
Global Const $NS_DEC = "0-1-2-3-4-5-6-7-8-9", _
$NS_HEX = "0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F", _
$NS_BIN = "0-1", _
$NS_OCT = "0-1-2-3-4-5-6-7", _
$NS_ABC = "A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z"
Func _NumberConvert($sValue, $sNSystemFrom, $sNSystemTo)
If $sNSystemFrom = $sNSystemTo Then
Return $sValue
EndIf
Local $sReturn, $bSign, $iDec, $iToCap, $iExponent = -1, $fTmp
If StringLeft($sValue, 1) = "-" Then
$bSign = True
$sValue = StringTrimLeft($sValue, 1)
EndIf
Local Const $S_NS_FROM = StringReplace($sNSystemFrom, "-", ""), _
$A_NS_FROM = StringSplit($sNSystemFrom, "-", 2), _
$A_NS_TO = StringSplit($sNSystemTo, "-", 2), _
$A_VALUE = StringSplit($sValue, "", 2)
Local $A_NS_DEC[UBound($A_NS_FROM)]
For $i = 0 To UBound($A_NS_FROM) - 1
$A_NS_DEC[$i] = $i
Next
For $i = 0 To UBound($A_VALUE) - 1
$iDec += $A_NS_DEC[StringInStr($S_NS_FROM, $A_VALUE[$i])-1] * UBound($A_NS_FROM) ^ (UBound($A_VALUE) - 1 - $i)
Next
Do
$sReturn = $A_NS_TO[Mod($iDec, UBound($A_NS_TO))] & $sReturn
If $iDec / UBound($A_NS_TO) <> Int($iDec / UBound($A_NS_TO)) Then
$iDec = Int($iDec / UBound($A_NS_TO))
Else
$iDec /= UBound($A_NS_TO)
EndIf
Until $iDec = 0
If $bSign = True Then $sReturn = "-" & $sReturn
Return $sReturn
EndFunc
Mache werden sicherlich sagen, ja das gibts doch schon! Ich hab das im Forum xy gesehen oder das hab ich schon lange selbstgemacht!
Da kann ich nur zustimmen, aber ich möchte es anderen die daran interessiert sind nicht vorenthalten!
Lob und Kritik sind sehr willkommen und freu mich schon auf euer Feedback!
Die UDF könnt ihr beliebig umbenennen, weil sich #include <NumberConvert ohne Errorhandling.au3> wahrscheinlich nicht so toll ist wie #include <NumberConvert.au3>!
Wichtig, bitte benutzt die Version ohne Errorhandling ("NumberConvert ohne Errorhandling.au3"), da man dort mehr als nur ein Zeichen konvertieren kann.
Important, please download the version (2nd) ("NumberConvert ohne Errorhandling.au3") without error handling because it allows you to convert more than one character.