• 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
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    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
    [autoit]


    dim $teststring = "10,5"

    [/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, $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

    [/autoit]

    2 Mal editiert, zuletzt von nuts (30. April 2009 um 18:55)