- Offizieller Beitrag
In der SB war die Frage, wie man eine Zahl mit den Tausenderpunkten ausgeben kann.
Hier mal eine Lösung dazu.
Eingabe:
- als nummerischer Wert (Komma als Punkt)
- als String (Komma als Zeichen)
Ausgabe:
- Tausendertrenner "." - Dezimaltrenner "," (Standard)
- Tausendertrenner "," - Dezimaltrenner "." (zweiten Parameter übergeben <> "DE")
Limitiert auf 18 Vorkommastellen - sollte aber wohl reichen. Wer mehr braucht: im Pattern weitere Dreierblocks ( "(\d{3})?" ) einfügen.
Man könnte das Pattern auch dynamisch über die Stringlänge anpassen. Aber ich denke so reicht es auch.
Spoiler anzeigen
$i = '1234567890,97'
ConsoleWrite('EN: ' & _NumberFormatThousand($i, 'EN') & @CRLF)
$i = 12345678901234567
ConsoleWrite('EN: ' & _NumberFormatThousand($i, 'EN') & @CRLF)
$i = 123456789.1234
ConsoleWrite('EN: ' & _NumberFormatThousand($i, 'EN') & @CRLF & @CRLF)
$i = '1234567890,97'
ConsoleWrite('DE: ' & _NumberFormatThousand($i) & @CRLF)
$i = 12345678901234567
ConsoleWrite('DE: ' & _NumberFormatThousand($i) & @CRLF)
$i = 123456789.1234
ConsoleWrite('DE: ' & _NumberFormatThousand($i) & @CRLF)
Func _NumberFormatThousand($vNumber, $ret='DE') ; bis 18 Vorkommastellen
Local $sOut = '', $a = StringRegExp(StringReplace($vNumber, '.', ','), "(-?\d{1,3})(\d{3})?(\d{3})?(\d{3})?(\d{3})?(\d{3})?(?:\Z|(,\d+))", 3)
For $i = 0 To UBound($a) -1
If $a[$i] <> '' Then $sOut &= '.' & $a[$i]
Next
If $ret <> 'DE' Then Return StringTrimLeft(StringReplace(StringReplace($sOut, '.', ','), ',,', '.'), 1)
Return StringTrimLeft(StringReplace($sOut, '.,', ','), 1)
EndFunc
Edit: Vielleicht bekommt jemand das ja auch mit StringFormat() hin. Falls ja - würde mich mal interessieren. Die Funktion liegt mir überhaupt nicht.
Edit 26.03.2011:
Ich habe gerade eine Funktion zur Währungsausgabe benötigt. Da diese z.T. auf der vorigen Funktion basiert, hänge ich sie mal hier mit an.
Währungssymbol, Dezimaltrenner und Gruppenseperator werden aus den Ländereinstellungen des PC übernommen. Ihr könnt ja zum Testen mal ein anderes Länderformat aktivieren.
_FormatCurrency
; Ausgabe PC-Währung, Standard-Währungseinstellung
ConsoleWrite(_FormatCurrency(200*12345) & @CRLF) ; ==> 2.469.000,00 € , Länderformat USA: 2,469,000.00 $
; Ausgabe Dollar, Währungssymbol führend
ConsoleWrite(_FormatCurrency(-200*12345, -1, -1, '$', -1, 1) & @CRLF) ;==> $ -2.469.000,00 , Länderformat USA: -2,469,000.00 $
; Ausgabe Dollar, Währungssymbol führend, negativer Wert in Klammern
ConsoleWrite(_FormatCurrency(-200*12345, -1, -1, '$', -1, 1, 1) & @CRLF) ;==> [$ -2.469.000,00] , Länderformat USA: [$ -2,469,000.00]
; Ausgabe PC-Währung, mit Vornull
ConsoleWrite(_FormatCurrency(4/80) & @CRLF) ;==> 0,05 € , Länderformat USA: 0.05 $
; Ausgabe PC-Währung, ohne Vornull
ConsoleWrite(_FormatCurrency(4/80, -1, -1, -1, 0) & @CRLF) ;==> ,05 € , Länderformat USA: .05 $
;===============================================================================
; Function Name...: _FormatCurrency
; Description.....: Formatiert einen Ausdruck als Währung
; Parameter(s)....: $iExpression der zu formatierende Ausdruck
; Requirement(s)..: $iNumDigit Anzahl Nachkommastellen, -1 = Währungseinstellung PC (Standard)
; $iGroupDig Anzahl Zeichen für Gruppierung, -1 = 3 Zeichen (Standard)
; $sCurr Währungszeichen, -1 = Währungseinstellung PC (Standard)
; $iLeadingZero Führende Null anzeigen, -1 = Währungseinstellung PC (Standard), 0 = nein
; $fLeadingSign Währungszeichen führend anzeigen, 0 = nein (Standard)
; $fNegNumInPara Negative Werte in eckigen Klammern anzeigen, 0 = nein (Standard)
; Return Value(s).: Der formatierte Währungsstring
; Note............: Die Gruppierung ermöglicht maximal 8 Blöcke
; Author(s).......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _FormatCurrency($iExpression, $iNumDigit=-1, $iGroupDig=-1, $sCurr=-1, $iLeadingZero=-1, $fLeadingSign=0, $fNegNumInPara=0)
Local $sRegKey = 'HKCU\Control Panel\International', $sReturn, $aTmp, $sTmp, $sNul = '000000000', $fNeg = 0
Local $sDec = RegRead($sRegKey, 'sMonDecimalSep'), $sThousand = RegRead($sRegKey, 'sMonThousandSep')
Local $sNegative = RegRead($sRegKey, 'sNegativeSign')
If $iGroupDig < 0 Then $iGroupDig = 3
If $sCurr = -1 Then $sCurr = RegRead($sRegKey, 'sCurrency')
If $iNumDigit = -1 Then $iNumDigit = RegRead($sRegKey, 'iCurrDigits')
If $iLeadingZero = -1 Then $iLeadingZero = RegRead($sRegKey, 'iLZero')
If IsFloat($iExpression) Then
$iExpression = Round($iExpression, $iNumDigit)
$sReturn = String($iExpression)
If $iNumDigit Then
$aTmp = StringSplit(String($iExpression), '.')
$sReturn = $aTmp[1] & Chr(29) & StringLeft($aTmp[2] & $sNul, $iNumDigit)
EndIf
Else
$sReturn = String($iExpression)
If $iNumDigit Then $sReturn = String($iExpression) & Chr(29) & StringLeft($sNul, $iNumDigit)
EndIf
If Not $iLeadingZero And StringRegExp($sReturn, '^-?0' & Chr(29) & '\d*') Then $sReturn = StringReplace($sReturn, '0' & Chr(29), Chr(29), 1)
If $iGroupDig > 0 And StringLen(Abs($sReturn)) >= $iGroupDig Then
$aTmp = StringRegExp(StringReplace($sReturn, '.', Chr(29)), _
"(-?\d{1,"&$iGroupDig&"})(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(\d{"&$iGroupDig&"})?(?:\Z|("&Chr(29)&"\d+))", 3)
For $i = 0 To UBound($aTmp) -1
If $aTmp[$i] <> '' Then $sTmp &= $sThousand & $aTmp[$i]
Next
$sReturn = StringTrimLeft(StringReplace($sTmp, $sThousand&Chr(29), Chr(29)), 1)
EndIf
If StringLeft($sReturn, 1) = '-' Then $fNeg = 1
$sReturn = StringReplace(StringReplace($sReturn, '-', $sNegative), Chr(29), $sDec)
If $fLeadingSign Then
$sReturn = $sCurr & ' ' & $sReturn
Else
$sReturn &= ' ' & $sCurr
EndIf
If $fNeg And $fNegNumInPara Then $sReturn = '[' & $sReturn & ']'
Return $sReturn
EndFunc ;==>_FormatCurrency