Funktion _StringAddComma() geändert

    • Offizieller Beitrag

    In 'Hilfe & Unterstützung' hatten wir ja grad das Thema mit _StringAddComma() und dass man dort beim Übergabewert kein Dezimalpunkt verwenden darf, wenn man als Ergebnis ein Dezimalkomma haben möchte. Als Beispiel:

    [autoit]


    #include<String.au3>
    MsgBox(0, '', _StringAddComma('123456789,567', '.', ','))

    [/autoit]


    Dieses Beispiel funktioniert, weil der Übergabewert ebenfalls ein Dezimalkomma enthält.

    Folgendes Beispielscript hingegen liefert einen falschen Wert:

    [autoit]


    #include<String.au3>
    MsgBox(0, '', _StringAddComma('123456789.567', '.', ','))

    [/autoit]


    Dabei kommt: 1234567.456.789 raus

    Jetzt habe ich mir gedacht, es muß doch möglich sein, dass man das universell hinbekommt und so habe ich die Funktion mal umgeschrieben.
    Bei meiner geänderten Version kann man sowohl den Dezimalpunkt als auch das Dezimalkomma verwenden. So nebenbei hat sie noch den Vorteil etwas schneller zu sein. :)

    Ich habe mal ein Testscript erstellt:

    [autoit]


    Global $t1, $t2

    [/autoit][autoit][/autoit][autoit]

    For $i= 1 To 50000
    $start = TimerInit()
    $r1 = xStringAddComma('123456789,567', '.', ',') & ' E=' & @error
    $t1 += TimerDiff($start)

    $start = TimerInit()
    $r2 = _StringAddComma('123456789,567', '.', ',') & ' E=' & @error
    $t2 += TimerDiff($start)
    Next

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,'Ergebnis','xString = ' & $r1 & ' (' & $t1/$i & ')' & @CRLF & @CRLF & '_String = ' & $r2 & ' (' & $t2/$i & ')')

    [/autoit][autoit][/autoit][autoit]

    ; Das ist meine geänderte xStringAddComma() - Funktion
    Func xStringAddComma($sStr, $sSeparator = ',', $sEnd = '.')
    Local $aNum = StringSplit($sStr, '.,'), $l = StringLen($aNum[1]), $r = ''
    If $aNum[0] > 2 Then Return SetError(1, 0, $sStr)
    Switch $l
    Case 0 To 3
    Return StringRegExpReplace($sStr, '[.,]', $sEnd)
    Case Else
    For $i = 1 To Int($l / 3)
    $r = $sSeparator & StringRight($aNum[1], 3) & $r
    $aNum[1] = StringTrimRight($aNum[1], 3)
    Next
    $r = StringTrimLeft($aNum[1] & $r, $aNum[1] = '')
    If $aNum[0] > 1 Then $r &= $sEnd & $aNum[2]
    Return $r
    EndSwitch
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    ; Das ist die 'offizielle' _StringAddComma() - Funktion (aus: ..\include\String.au3)
    Func _StringAddComma($sStr, $sSeparator = -1, $sEnd = -1)
    If $sSeparator = -1 Or $sSeparator = Default Then $sSeparator = ','
    If $sEnd = -1 Or $sEnd = Default Then $sEnd = '.'
    Local $aNum = StringSplit($sStr, $sEnd), $sHold = '', $aSRE, $bUB = False
    If UBound($aNum) > 2 Then
    $aSRE = StringRegExp($aNum[1], '(\d+)(\d{3})', 1)
    $bUB = True
    Else
    $aSRE = StringRegExp($sStr, '(\d+)(\d{3})', 3)
    EndIf
    If UBound($aSRE) = 2 Then
    While IsArray($aSRE)
    $sHold = $sSeparator & $aSRE[1] & $sHold
    $aSRE = StringRegExp($aSRE[0], '(\d+)(\d{3})', 3)
    WEnd
    EndIf
    Local $nStrLen = StringLen(StringReplace($sHold, $sSeparator, ''))
    If $bUB And $sHold Then
    Return StringTrimRight($aNum[1], $nStrLen) & $sHold & $sEnd & $aNum[2]
    ElseIf $sHold Then
    Return StringTrimRight($sStr, $nStrLen) & $sHold
    EndIf
    Return SetError(1, 0, $sStr)
    EndFunc ;==>_StringAddComma

    [/autoit]