- 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', '.', ','))
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', '.', ','))
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
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
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
; 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