Zahlen, Datums- und Zeitangaben sowie Währungen formatieren mit Formatoperator -f in PowerShell


    Tags: ,

    Datum und Zahlen formatierenWenn ein Kom­mando eine Kombi­nation aus Zeichen­ketten, num­merischen Werten und Varia­blen aus­geben soll, dann kann sie der Format­operator "-f" diese fast beliebig anpassen. Besonders flexibel zeigt er sich bei Datums­angaben oder Zahlen. Gleich­zeitig erhöht er die Les­bar­keit des Codes.

    Wenn man in PowerShell Text und Variablen zusammen ausgeben will, dann platziert man im einfachsten Fall beide innerhalb der Anführungs­zeichen. Viel Kontrolle über das Aussehen des Outputs hat man dabei aber nicht. Alternativ akzeptiert ToString() die hier vorgestellten Format-Strings für die Aufbereitung von Zahlen.

    Syntax für die Platzhalter

    Der Formatoperator bietet eine zusätzliche Flexibilität durch Verwendung von Platzhaltern mit Index, die sich bei Bedarf auch mehrfach verwenden lassen. Sie stehen in geschweiften Klammern und enthalten optional noch eine Zahl für die Ausrichtung der Daten und eine Format­zeichen­kette:

    {<Index>[,<Ausrichtung>][:<Formatierung>]}

    Ein einfaches Beispiel könnte so aussehen:

    $tag = "Sonntag"
    "Heute ist der {0}. {1} im September" -f "3", $tag

    Das Ergebnis lautet erwartungsgemäß "Heute ist der 3. Sonntag im September". Wie man leicht erkennen kann, ersetzt PowerShell die Indizes in der Zeichenkette in der vorgegebenen Reihenfolge durch die Werte, die rechts vom Format-Operator stehen, also {0} durch "3" und {2} durch $tag.

    Einfache Ersetzung der Platzhalter mit dem Formatoperator

    Wie erwähnt, lässt sich ein Index auch mehrfach verwenden:

    "Heute ist die {0}. Woche und der {0}. {1} im September" -f "3", $tag

    Mit Leerzeichen auffüllen

    Angenommen, man möchte einen Vornamen um so viele Leerzeichen auffüllen, damit eine Spalten­breite von 25 Zeichen entsteht und sich damit eine rechtsbündige Ausrichtung ergibt:

    "Vorname: {0,25}, Nachname: {1}" -f "Peter", "Müller"

    Diese Formatierung ließe sich zum Beispiel auch auf eine Liste von Namen anwenden, die man aus dem Active Directory ausliest:

    Get-ADUser -Filter * -SearchBase "OU=IT,DC=contoso,DC=local"|
    foreach{"Vorname: {0,-20} Nachname: {1}" -f $_.givenname, $_.surname}

    Hier würde jeder Vorname um die notwendige Zahl an Leerzeichen ergänzt, um eine Spaltenbreite von 20 zu erhalten. Eine negative Zahl bedeutet, dass der Format­operator die Daten rechts auffüllt, während das sonst von links erfolgt.

    Auffüllen des Ersetzungstextes mit Leerzeichen.

    Sein Verhalten ändert sich dabei auch nicht, wenn man ihm einen num­merischen Wert übergibt. Die Ausrichtung erfolgt hier ebenfalls über Leerzeichen. Will man in diesem Fall etwa eine Zahl mit Nullen auffüllen, dann geht das nur über die Formatoption, nicht über die Ausrichtung.

    Strings für die Formatierung

    Der Operator unterstützt für die Formatierung die von .NET stammenden Strings. Dazu zählen für Zahlen unter anderem:

    D Ganze Zahlen, auch mit negativem Vorzeichen
    E Exponentialschreibweise
    F, N Ganze oder Dezimalzahlen, auch mit Vorzeichen
    P Prozent
    X Hexadezimal
    C Währung

    Bei allen außer bei F lässt sich die Zahl der ausgegebenen Stellen einfach durch eine entsprechende Angabe festlegen:

    "Die Zahl PI {0:N2} mit 2 Dezimalstellen formatiert." -f 3.14159

    Das Ergebnis ist erwartungsgemäß 3.14. Schneidet man Nachkommastellen auf diese Weise ab, dann runden N wie F:

    "Die Zahl {0:N2} formatiert und gerundet" -f 1.555

    gibt 1,56 aus.

    Die Formatierung von Währungen hängt von der eingestellten Culture ab. Zu beachten ist weiterhin, dass die Darstellung im Hex-Format nur für ganzzahlige Werte möglich ist. Die Ausgabe in Prozent multipliziert die Zahl mal 100 und fügt ein Prozentzeichen hinzu:

    "Die Zahl {0:N} als Prozent formatiert: {0:P}" -f (3/4)

    Ausgabe von Zahlen anpassen mit Hilfe von Format-Strings.

    Wie man hier sieht, akzeptiert der Formatoperator auch Ausdrücke, in diesem Beispiel ist es nur eine einfache Division. Es sind aber auch komplexe Ausdrücke oder der Aufruf von Cmdlets möglich:

    "Vorname von Müller: {0}" -f (Get-ADUser -Filter 'surname -eq "Mueller"').givenname

    Unter der Annahme, dass nur eine Person mit dem Nachnamen "Müller" im AD existiert, könnte man so ihren Vornamen anzeigen.

    Für Zahlen gibt es neben den oben genannten Formatierungs­optionen noch '#' als Platzhalter für eine Ziffer. Damit ließe sich etwa eine Telefon­nummer, die ohne Trennzeichen eingegeben wurde, ordentlich darstellen:

    "Darstellung einer formatierten Telefonnummer {0:####-###-#####}" -f 004921156784

    Der letzte Block im Muster sieht hinter der Ortsvorwahl 5 Stellen vor. Ist die Nummer länger, wird sie abgeschnitten, ist die jedoch kürzer, dann hat das keine Folgen.

    Mit einem Komma lassen sich Tausender­trennzeichen einfügen:

    "Mit Tausendertrennzeichen {0:#,#}" -f 100957243678

    Zahlen nach beliebigen Mustern formatieren mit dem #-Platzhalter

    Datum formatieren

    Über die Eigenschaften eines DateTime-Objekts, wie es zum Beispiel Get-Date zurückgibt, lassen sich Jahr, Tag, Monat oder Wochentag ohne großen Aufwand auslesen. Wenn man diese Bestandteile jedoch in einer bestimmten Form anordnen möchte, dann geht das mit dem Operator -f einfacher:

    "Das heutige Datum ist {0:dddd}, der {0:dd.MM.yyyy}" -f (Get-Date)

    Die Ausgabe sieht wie folgt aus:

    Das heutige Datum ist Samstag, der 02.09.2017

    Für die Formatierung von Datums- und Zeitangaben sind folgende Strings zulässig:

    :ddd Wochentag (abgekürzt)
    :dddd Voller Name des Wochentags
    :dd Tag des Monats
    :MMMM Name des Monats
    :MM Monat (nummerisch)
    :yy Jahr 2-stellig
    :yyyy Jahr 4-stellig
    :hh Stunde
    :HH Stunde im 24-Stundenformat
    :mm Minuten
    :ss Sekunden

    Keine Kommentare