Ausgabestring Längengruppiert für bis zu 10 Werte

    • Offizieller Beitrag

    Ihr kennt es bestimmt auch: z.B. beim Debuggen möchte man sich im Schleifendurchlauf mehrere Werte nebeneinander anzeigen lassen. Schön wäre es natürlich, wenn diese Werte dann auch immer genau übereinander, also in Tabellenform ausgegeben werden.
    Genau das ermöglicht die Funktion _LenGroupedOutput.
    Der Einsatz beschränkt sich natürlich nicht nur auf die Konsolenausgabe. Überall, wo mit fixen Stringlängen gearbeitet werden soll ist es recht nützlich.
    So gehts:
    - Parameter $sLen -- legt die Stringlänge für die übergebenen Werte fest.
    Dabei gilt:
    '-ANZAHL' -- Alle Werte bekommen die Länge ANZAHL
    'ANZAHL_1,ANZAHL_2, ..ANZAHL_n' -- Länge für Element 'n' ; bei Ausrichtung Links nur bis n-1 erforderlich (Angabe bis vorletztes Element)
    - Parameter $charFill -- Zeichen, das zum Auffüllen verwendet werden soll
    - Parameter $iAlign -- Ausrichtung: 0=Links, 1=Rechts
    - Parameter $var_1 .._10 -- Die zu gruppierenden Werte

    Und so sieht es dann z.B. aus:

    Spoiler anzeigen
    _LenGroupedOutput(v0.1)
    [autoit]

    ConsoleWrite('Ausrichtung: Links, Länge für jeden Wert übergeben:' & @CRLF)
    For $i = 1 To 8
    ConsoleWrite(_LenGroupedOutput('10,6,4,8,8,8', '.', 0, Random(10,10000,1),Random(10,1000,1),Random(1,100,1),Random(10,10000,1),Random(10,10000,1),Random(10,10000,1)) & @CRLF)
    Next
    ConsoleWrite(@CRLF & 'Ausrichtung: Rechts, eine Länge gültig für alle Werte:' & @CRLF)
    For $i = 1 To 8
    ConsoleWrite(_LenGroupedOutput('-8', '.', 1, Random(10,10000,1),Random(10,1000,1),Random(1,100,1),Random(10,10000,1),Random(10,10000,1),Random(10,10000,1)) & @CRLF)
    Next

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

    ;===============================================================================
    ; Function Name....: _LenGroupedOutput
    ; Description......: Längengruppierten Ausgabestring aus bis zu 10 Werten erzeugen
    ; Parameter(s).....: $sLen Festlegen der Stringlänge der übergebenen Werte
    ; '-ANZAHL' das Minus gibt an: ANZAHL gilt für ALLE übergebenen Werte
    ; 'ANZAHL_1,ANZAHL_2,..ANZAHL_n' ANZAHL_n für Element 'n' ; bei $iAlign=0: n-1 (bis vorletztes Element)
    ; $charFill Zeichen, das zum Auffüllen verwendet werden soll
    ; $iAlign '0'= LeftAlign, '1'= RightAlign
    ; $var_1 .._10 Bis zu 10 Werte, die gruppiert werden sollen
    ; Return Value(s)..: Erfolg Der gruppierte String
    ; Fehler @error 1 - $sLen nicht für alle Elemente übergeben
    ; @error 2 - $charFill ist Leerstring oder zu lang
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _LenGroupedOutput($sLen, $charFill, $iAlign, $var_1, $var_2, $var_3='-0', $var_4='-0', $var_5='-0', $var_6='-0', $var_7='-0', $var_8='-0', $var_9='-0', $var_10='-0')
    Local $aVar[9], $index = 0, $aLen, $sFill = '', $sOut = ''
    If $iAlign <> 1 Then $iAlign = 0
    If StringLen($charFill) <> 1 Then Return SetError(2,0,0)
    For $i = 1 To 30
    $sFill &= $charFill
    Next
    For $i = 1 To 10
    If Eval('var_' & $i) <> '-0' Then
    $aVar[$i-1] = Eval('var_' & $i)
    $index = $i -1
    Else
    ExitLoop
    EndIf
    Next
    If StringLeft($sLen, 1) = '-' Then
    $aLen = StringSplit(StringTrimLeft($sLen, 1), ',', 2)
    ReDim $aLen[$index+1]
    For $i = 1 To $index
    $aLen[$i] = $aLen[0]
    Next
    Else
    $aLen = StringSplit($sLen, ',', 2)
    If UBound($aLen) < $index Then Return SetError(1,0,0)
    EndIf
    For $i = 0 To $index
    If $iAlign = 0 Then
    If $i = $index Then ExitLoop
    $sOut &= StringLeft($aVar[$i] & $sFill, $aLen[$i])
    Else
    $sOut &= StringRight($sFill & $aVar[$i], $aLen[$i])
    EndIf
    Next
    If $iAlign = 0 Then $sOut &= $aVar[$index]
    Return $sOut
    EndFunc ;==>_LenGroupedOutput

    [/autoit]
  • Nette Funktion!
    Ich bin aber kein Freund von 'Eval()' und Co.
    Und da StringFormat beinahe die selben Möglichkeiten bietet, habe ich das ganze mal kurz umgeschrieben.
    Hier das Ergebnis:

    Spoiler anzeigen
    [autoit]

    Local $aTest[8]

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

    For $i = 1 To 5
    For $j = 0 To UBound($aTest) - 1
    $aTest[$j] = Random(10, 10000, 1)
    Next
    ConsoleWrite(_LenGroupedOutput2(10, " ", 0, $aTest) & @CRLF)
    Next

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

    ConsoleWrite(@CRLF)

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

    For $i = 1 To 5
    For $j = 0 To UBound($aTest) - 1
    $aTest[$j] = Random(10, 10000, 1)
    Next
    ConsoleWrite(_LenGroupedOutput2(10, ".", 1, $aTest) & @CRLF)
    Next

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

    Func _LenGroupedOutput2($sLen, $charFill, $iAlign, $a)
    Local $sSinglePattern, $sPattern
    If Not IsArray($a) Then Return SetError(1)
    If UBound($a) > 32 Then Return SetError(2)

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

    If $iAlign = 0 Then
    $sSinglePattern = "%-" & $sLen & "s"
    Else
    $sSinglePattern = "%" & $sLen & "s"
    EndIf
    For $i = 1 To UBound($a)
    $sPattern &= $sSinglePattern
    Next
    ReDim $a[32]
    Local $sRet = StringFormat($sPattern, $a[0], $a[1], $a[2], $a[3], $a[4], $a[5], $a[6], $a[7], $a[8], $a[9], $a[10], $a[11], $a[12], $a[13], $a[14], $a[15], _
    $a[16], $a[17], $a[18], $a[19], $a[20], $a[21], $a[22], $a[23], $a[24], $a[25], $a[26], $a[27], $a[28], $a[29], $a[31], $a[31])
    Return StringReplace($sRet, " ", StringLeft($charFill, 1))
    EndFunc ;==>_LenGroupedOutput2

    [/autoit]
    • Offizieller Beitrag

    Nun, ich finde an Eval() nichts auszusetzen , solange man es dosiert einsetzt. Und um eine variable Zahl an Parametern zu übergeben hat man keine andere Wahl. Vorher ein Parameterarray zu erstellen oder einen Parameterstring den ich dann splitte, halte ich für wenig komfortabel.
    Und wie progandy auch richtig anmerkte (in einem anderen Thread), sollte man der Geschwindigkeit zu liebe auf das langsame StringFormat verzichten.