Hey,
mit folgendem Problem kämpfe ich schon etwas länger.
Ein ausgelesener Zahlenwert (aus einem Input oder woher auch immer) soll immer auf 2 Dezimalstellen aufgefüllt werden. z.B.
1000,00 -> bleibt 1000,00
1000, -> wird zu 1000,00
1000,0 -> wird zu 1000,00
Zusatzoption ($auto): Das Dezimaltrennzeichen wird automatisch eingefügt (kennt man von Tippmaschienen)
1000 -> 10,00
Hierzu hab ich folgende Funktion gebastelt, es ist etwas an die _StringAddThousandsSep Funktion angelehnt.
Alle andere Eingaben außer Zahlen und Zahlen mit Dezimaltrennzeichen hab ich als Eingabe ausgeschlossen (ich hoffe erfolgreich)
Spoiler anzeigen
dim $teststring = "1234"
[/autoit] [autoit][/autoit] [autoit]MsgBox(1, "Ergebnis", _StringFormat($teststring))
[/autoit] [autoit][/autoit] [autoit]Func _StringFormat($string, $auto=0)
; $auto = 0 -> Automatik an
; $auto = 1 -> Automatik aus
dim $sergebnis, $sDecimal
Local $rKey = "HKCU\Control Panel\International"
$sDecimal = RegRead($rKey, "sDecimal") ;zum Auslesen welches Dezimaltrennzeichen verwendet wird
Local $dummy = 1
$astring = StringSplit($string, $sDecimal)
If StringIsInt($string) = 0 then
$dummy = 0
Switch $astring[0]
case 1
$dummy = 0
case 2
$dummy = 1
case else
$dummy = 0
endswitch
EndIf
switch $dummy
case 0
Return "Ungültiges Format"
case 1
Local $sResult = ""
Local $aNumber = StringRegExp($String, "(\D?\d+)\D?(\d*)", 1)
If UBound($aNumber) = 2 and $aNumber[1] = "" then
Local $sleft = $aNumber[0]
switch $auto
case 0
$sResult = $sDecimal & StringRight($sLeft, 2) & $sResult
$sLeft = StringLeft($sLeft, StringLen($sleft)-2)
$sergebnis = $sleft & $sResult
case 1
$sergebnis = $sleft & ",00"
EndSwitch
elseif UBound($aNumber) = 2 and Stringlen($aNumber[1]) = 1 then
$sergebnis = $aNumber[0] & $sDecimal & $aNumber[1] & "0"
ElseIf UBound($aNumber) = 2 and Stringlen($aNumber[1]) = 2 then
$sergebnis = $aNumber[0] & $sDecimal & $aNumber[1]
ElseIf UBound($aNumber) = 2 and Stringlen($aNumber[1]) > 2 then
$sergebnis = $aNumber[0] & $sDecimal & StringLeft($aNumber[1],2)
endif
endswitch
Return $sergebnis
endfunc ; => _StringFormat by Nuts
Ist natürlich ne Menge Code, aber mir ist kein anderer Ansatz eingefallen, da ich mit den Stringfunktionen nicht so vertraut bin.
Mit Sicherheit nicht die ideale Lösung - Optimierungsvorschläge sind daher erwünscht.
Gruß nuts
edit \ habs nochmal etwas umgebaut. Probleme machen noch Eingaben wie ,20
Spoiler anzeigen
dim $teststring = "10,5"
MsgBox(1, "Ergebnis", _StringFormat($teststring))
[/autoit] [autoit][/autoit] [autoit]Func _StringFormat($string, $auto=0)
; $auto = 0 -> Automatik an
; $auto = 1 -> Automatik aus
dim $sergebnis, $sDecimal, $sLeft
Local $sResult = ""
Local $rKey = "HKCU\Control Panel\International"
$sDecimal = RegRead($rKey, "sDecimal") ;zum Auslesen welches Dezimaltrennzeichen verwendet wird
Local $dummy = 1
local $astring = StringSplit($string, $sDecimal)
If StringIsInt($string) = 0 then
$dummy = 0
Switch $astring[0]
case 1
$dummy = 0
case 2
$dummy = 1
case else
$dummy = 0
endswitch
EndIf
switch $dummy
case 0
Return "Ungültiges Format"
case 1
Local $aNumber = StringRegExp($String, "(\D?\d+)\D?(\d*)", 1)
Local $slen = Stringlen($aNumber[1])
switch $slen
case 0
switch $auto
case 0
$sResult = $sDecimal & StringRight($aNumber[0], 2)
$sLeft = StringLeft($aNumber[0], StringLen($aNumber[0])-2)
if $sleft = "" then $sleft = "0"
$sergebnis = $sleft & $sResult
case 1
$sergebnis = $aNumber[0] & ",00"
EndSwitch
case 1
$sergebnis = $aNumber[0] & $sDecimal & $aNumber[1] & "0"
case 2
$sergebnis = $aNumber[0] & $sDecimal & $aNumber[1]
case Else
$sergebnis = $aNumber[0] & $sDecimal & StringLeft($aNumber[1],2)
EndSwitch
endswitch
Return $sergebnis
endfunc ; => _StringFormat by Nuts