- Offizieller Beitrag
Ich dachte eigentlich, dass ich vor 4..5 Jahren schonmal solch eine Funktion erstellt habe - finde sie aber nicht mehr.
Ihr kennt ja sicher die sehr mächtige Funktion StringFormat. Und somit wißt ihr auch, wie schwer man sich diese Syntax merken kann.
In der Mehrzahl der Fälle brauche ich es um Zahlenwerte mit Vornullen oder fester Nachkommastellenlänge auszugeben. Und jedes mal grübele ich aufs Neue, wie die Syntax ist.
Deshalb nun diese Funktion mit einer simpleren Syntax. Vielleicht auch eine Hilfe für andere.
Spoiler anzeigen
ConsoleWrite( _FormatNumber('N5', '1243')& @CRLF) ; == Ganzzahl, 5-stellig (min) (Auffüllen mit Vornullen)
ConsoleWrite( _FormatNumber('n5', '1243')& @CRLF) ; == Ganzzahl, 5-stellig (min) (Auffüllen mit Leerzeichen)
ConsoleWrite( _FormatNumber('N5.2', '1243.5')& @CRLF) ; == Float, 5 Vorkommastellen (min) (Auffüllen mit Vornullen), 2 Nachkommastellen (Ergänzen mit Nullen)
ConsoleWrite( _FormatNumber('n.3', '1243.56')& @CRLF) ; == Float, Vorkomma wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
;===============================================================================
; Function Name....: _FormatNumber
; Description......: Formatierung von Zahlenwerten (mit und ohne Vorzeichen, Integer od. Float)
; Parameter(s).....: $sMask Maske zum Bestimmen des Ausgabestrings
; N3 Ganzzahl min. 3 Stellen, Auffüllen mit Vornullen
; n3 Ganzzahl min. 3 Stellen, Auffüllen mit Leerzeichen
; N3.2 Float min. 3 Vorkommastellen (Auffüllen mit Vornullen), min. 2 Nachkommastellen (Ergänzen mit Nullen)
; n.3 Float, Vorkommastellen wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
; $sString der zu formatierende Zahlenwert
; Note.............: Bei negativen Zahlenwerten wird das Vorzeichen mit zur Anzahl der Vorkomma/Stellen eingerechnet
; Return Value(s)..: der formatierte Zahlenwert
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _FormatNumber($sMask, $sString)
Local $sType = StringLeft($sMask, 1)
Local $preZero = StringIsUpper($sType)
$sMask = StringTrimLeft($sMask, 1)
$sMask = StringSplit($sMask, '.', 2)
If UBound($sMask) = 1 Then
If $preZero Then
Return StringFormat('%0' & $sMask[0] & 'd', $sString)
Else
Return StringFormat('%' & $sMask[0] & 'd', $sString)
EndIf
Else
If $preZero Then
Return StringFormat('%0' & $sMask[0] + $sMask[1] +1 & '.' & $sMask[1] & 'f', $sString)
Else
Return StringFormat('%' & StringInStr($sString, '.') + $sMask[1] & '.' & $sMask[1] & 'f', $sString)
EndIf
EndIf
EndFunc ;==>_FormatNumber
Und hier mal die Umsetzung mit progandys Anregung:
Oops - da fällt mir auf: Bei negativen Zahlen stimmt die Anordnung des Vorzeichens noch nicht. Jetzt passt es.
Ändere ich gleich noch.
Edit 01.10.20011
Heut Nacht fiel mir plötzlich ein: Was ist eigentlich mit Übergabe Float zur Ganzzahlformatierung und umgekehrt. Hatte ich noch nicht berücksichtigt.
Jetzt noch mal überarbeitet die wohl alles berücksichtigende Funktion:
_FormatNumber(v0.1)
Local $aNumbers[6] = [123, 123.456, -123, -123.856, 0.5, -0.5]
Local $aMasks[8] = ['N2', 'n2', 'N5', 'n5', 'N2.2', 'n.2', 'N5.2', 'n.3']
Local $sFill = '..........'
For $i = 0 To 5
For $j = 0 To 7
ConsoleWrite('> ' & StringLeft($aNumbers[$i] & $sFill, 10) & StringLeft($aMasks[$j] & $sFill, & _FormatNumber($aMasks[$j], $aNumbers[$i]) & @CRLF)
Next
Next
;===============================================================================
; Function Name....: _FormatNumber
; Description......: Formatierung von Zahlenwerten (mit und ohne Vorzeichen, Integer od. Float)
; Parameter(s).....: $sMask Maske zum Bestimmen des Ausgabestrings
; N3 Ganzzahl min. 3 Stellen, Auffüllen mit Vornullen
; n3 Ganzzahl min. 3 Stellen, Auffüllen mit Leerzeichen
; N3.2 Float min. 3 Vorkommastellen (Auffüllen mit Vornullen), min. 2 Nachkommastellen (Ergänzen mit Nullen)
; n.3 Float, Vorkommastellen wie übergeben, 3 Nachkommastellen (Ergänzen mit Nullen bzw. Runden auf Anzahl NK)
; $sString der zu formatierende Zahlenwert
; Note.............: Bei negativen Zahlenwerten wird das Vorzeichen mit zur Anzahl der Vorkomma/Stellen eingerechnet
; Return Value(s)..: der formatierte Zahlenwert
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _FormatNumber($sMask, $sString)
Local $aFill[2] = [' ','0000000000000000000'], $sLen
Local $preZero = StringIsUpper(StringLeft($sMask, 1)), $fFloat = 0, $fNegative = 0
If $sString < 0 Then $fNegative = 1
Local $aVal = StringSplit($sString, '.', 2)
If @error Then
ReDim $aVal[2]
Else
$fFloat = 1
EndIf
$sMask = StringTrimLeft($sMask, 1)
$sMask = StringSplit($sMask, '.', 2)
$sLen = StringLen($aVal[0])
If UBound($sMask) = 1 Then
If $sLen >= $sMask[0] Then
If $fFloat Then Return Round($sString)
Return $sString
Else
If $fFloat Then $sString = Round($sString)
If $fNegative Then Return '-' & StringReplace(StringLeft($aFill[$preZero], $sMask[0] - $sLen) & $sString, '-', '', 1)
Return StringLeft($aFill[$preZero], $sMask[0] - $sLen) & $sString
EndIf
Else
If $preZero And ($sLen < $sMask[0]) Then $aVal[0] = StringLeft($aFill[1], $sMask[0] - $sLen) & $aVal[0]
If $fFloat Then
$aVal[1] = Round('0.' & $aVal[1], $sMask[1])
$aVal[1] &= StringLeft($aFill[1], $sMask[1] - (StringLen($aVal[1]) -2))
If $fNegative Then Return '-' & StringReplace($aVal[0] & '.' & StringTrimLeft($aVal[1], 2), '-', '', 1)
Return $aVal[0] & '.' & StringTrimLeft($aVal[1], 2)
Else
If $fNegative Then Return '-' & StringReplace($aVal[0] & '.' & StringLeft($aFill[1], $sMask[1]), '-', '', 1)
Return $aVal[0] & '.' & StringLeft($aFill[1], $sMask[1])
EndIf
EndIf
EndFunc ;==>_FormatNumber