Formatierung Zahlenwerte

    • 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. :D

    Spoiler anzeigen
    [autoit]

    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)

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

    ;===============================================================================
    ; 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

    [/autoit]

    Und hier mal die Umsetzung mit progandys Anregung:

    Oops - da fällt mir auf: Bei negativen Zahlen stimmt die Anordnung des Vorzeichens noch nicht. :D
    Ändere ich gleich noch.
    Jetzt passt es.

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

    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 = '..........'

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

    For $i = 0 To 5
    For $j = 0 To 7
    ConsoleWrite('> ' & StringLeft($aNumbers[$i] & $sFill, 10) & StringLeft($aMasks[$j] & $sFill, 8) & _FormatNumber($aMasks[$j], $aNumbers[$i]) & @CRLF)
    Next
    Next

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

    ;===============================================================================
    ; 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

    [/autoit]
  • Wirkllich praktisch, wenn man sich die Syntax nicht merken kann. Wenn du StringFormat noch durch normale Stringfunktionen und Round ersetzt, wäre das ganze vermutlich schneller und ich würde es anstatt StringFormat verwenden obwohl ich die Syntax kenne ;)