===== Formatierung in Schablonen ===== ==== Anforderung ==== Hin und wieder kommt es vor, daß Zeichenketten oder Zahlen in den Druckdaten anders formatiert sind, als sie Ausdruck später erscheinen sollen. Zeichenketten müssen entweder gekürzt oder auf eine feste Länge erweitert werden. Zahlen müssen in vielfältiger Weise umformatiert werden: z.B. feste Anzahl Nachkommastellen oder Ausgabe mit Dreiergruppen in den Vorkommastellen zur Verbesserung der Lesbarkeit. \\ \\ ==== Realisierung ==== In den Schablonen von Feldern, in die Nutzdaten, die mit Hilfe regulärer Ausdrücke erfasst worden sind, eingefügt werden, wird nach der Angabe, welcher Ergebnispuffer verwendet werden soll, mit einem weiteren Doppelpunkt abgetrennt eine Formatangabe angefügt. Eine solche Formatangabe ist analog den bekannten Formatierungssequenzen aus diversen Programmiersprachen aufgebaut und besteht im Prinzip aus vier Bestandteilen: **Indikator**, **Weite**, **Genauigkeit** und **Typ**. \\ \\ === Indikatoren === Der erste **optionale** Teil einer Formatangabe gibt mit einem Zeichen an, wie die nachfolgenden Angaben zur Weite und Genauigkeit zu interpretieren sind. ^ Indikator ^ Bedeutung ^ | - | Richtet das Ergebnis links innerhalb der angegebenen Feldweite aus. Standardmäßig wird rechts ausgerichtet. | | + | Verwendet ein Vorzeichen (+ oder -) als Präfix des Ausgabewerts, wenn es sich um einen Typ mit Vorzeichen handelt. Standardmäßig wird nur bei negativen Werten ein Vorzeichen gedruckt. | | 0 | Wenn eine Null vorangestellt wird, werden führende Nullen hinzugefügt, bis die Mindestbreite erreicht ist. Wenn ein Minuszeichen vorangestellt ist, oder eine Genauigkeit angegeben ist, wird der Indikator Null ignoriert. Standardmäßig wird die Feldweite mit Leerzeichen aufgefüllt. | | Leerstelle | Bei Zahlen wird bei positivem Vorzeichen eine Leerstelle ausgegeben. Standardmäßig wird nur das negative Vorzeichen gedruckt. | \\ === Weite === In einer Formatangabe ist das zweite **optionale** Feld die Weitenangabe. Die Weite ist eine nicht negative ganze Dezimalzahl, die die Mindestanzahl der auszugebenden Zeichen steuert. Wenn die Anzahl der Zeichen im Ausgabewert kleiner als die angegebene Weite ist, werden Leerzeichen links oder rechts vom Wert - abhängig vom Indikator für Linksausrichtung - hinzugefügt, bis die angegebene Mindestbreite erreicht ist. Wenn der Weite das Zeichen Null als Indikator vorangestellt wird, werden führende Nullen zu Ganzzahl- oder Gleitkommakonvertierungen hinzugefügt, bis die Mindestbreite erreicht ist. Die Weitenangabe wird niemals dazu führen, daß ein Wert abgeschnitten wird. Wenn die Anzahl der Zeichen im Ausgabewert größer als die angegebene Weite ist oder wenn keine Weite angegeben ist, werden alle Zeichen des Werts ausgegeben. \\ \\ === Genauigkeit === In einer Formatangabe ist das dritte **optionale** Feld die Genauigkeitsspezifikation. Sie besteht aus einem Punkt (.) gefolgt von einer nicht negativen ganzen Dezimalzahl, die, abhängig vom Typ, die Anzahl von Zeichen, die Anzahl an Dezimalstellen oder die Anzahl der signifikanten Ziffern angibt. Anders als die Breitenangabe kann die Genauigkeitsspezifikation die Verkürzung eines Ausgabewerts oder das Runden eines Gleitkommawerts verursachen. \\ \\ === Typ === In der Formatangabe ist der Typ die einzig zwingende Angabe. Die Typangabe legt einerseits fest, wie die Eingangsdaten zu interpretieren sind (Zeichenkette vs Zahl) und wie die Ausgabe konkret aussehen soll. ^ Typ ^ Beschreibung ^ | b | Dient der Formatierung von ganzen Zahlen im Binärformat. Die Weite bestimmt die Anzahl der auszugebenden Bytes. Die Weite kann maximal 4 betragen (Weil ganze Zahlen intern mit 32 Bit dargestellt werden). | | B | Dient der Formatierung von Zeichenketten im Binärformat. Die Zeichenkette muss aus einer geraden Anzahl von Hexadezimalziffern bestehen, die jeweils paarweise interpretiert binär ausgegeben werden. | | d | Dient der Formatierung von ganzen Zahlen. Ein eventuell vorhandenes negatives Vorzeichen wird mit ausgegeben. Es kann eine minimale Weite vorgegeben werden. | | x | Dient der Formatierung von ganzen Zahlen im Hexadezimalsystem. Für die sechs zusätzlichen Ziffern wird ''abcdef'' verwendet. | | X | Dient der Formatierung von ganzen Zahlen im Hexadezimalsystem. Für die sechs zusätzlichen Ziffern wird ''ABCDEF'' verwendet. | | s | Dient der Formatierung von Zeichenketten. Es kann eine minimale Weite vorgegeben werden. | | f | Dient der Formatierung von Gleitkommazahlen. Ein eventuell vorhandenes negatives Vorzeichen wird mit ausgegeben. Es kann eine minimale Weite vorgegeben werden, die alle Ziffern, Vorzeichen sowie den Dezimaltrenner umfasst. Mit der Angabe der Präzision kann die Anzahl der Nachkommastellen eingestellt werden. | | F | Dient der Formatierung von Gleitkommazahlen mit Gruppierung der Vorkommastellen in Tausendergruppen. Ein eventuell vorhandenes negatives Vorzeichen wird mit ausgegeben. Es kann eine minimale Weite vorgegeben werden, die alle Ziffern, Vorzeichen sowie den Dezimaltrenner umfasst. Mit der Angabe der Präzision kann die Anzahl der Nachkommastellen eingestellt werden. | \\ ==== Beispiele ==== Innerhalb einer Schablone folgt die Formatangabe der Nummer des Ergebnispuffers. Beispiele für konkrete Inhalte von Schablonen könnten etwa so aussehen: ^ Schablone ^ Beschreibung ^ | \Gewicht:1:9.2f | Gibt den ersten Puffer des als ''Gewicht'' aufgenommen Werts in Form einer Zahl mit zwei Nachkommastellen aus. Das Feld für diese Ausgabe ist mindestens neun Stellen lang. | | \Gewicht:1:9.2F | Wie vorher, allerdings werden jetzt alle drei Vorkommastellen noch Tausenderpunkte eingefügt. | | \Postleitzahl:1:3b | Der erste Puffer des als ''Postleitzahl'' aufgenommenen Wertes wird als drei Byte binär ausgegeben (z.B. im Barcode). | Hier noch ein paar Beispiele für reine Formatangaben: ^ Format ^ Wert ^ Ausgabe(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp)(sp) ^ Beschreibung ^ | d | 123 | ''123'' | minimale Länge | | 5d | 0 | ''(sp)(sp)(sp)(sp)0'' | mindestens fünf Stellen, rechtsbündig | | 5d | 123456789 | ''123456789'' | mindestens fünf Stellen, rechtsbündig | | 5d | -10 | ''(sp)(sp)-10'' | mindestens fünf Stellen, rechtsbündig | | -5d | 0 | ''0(sp)(sp)(sp)(sp)'' | mindestens fünf Stellen, linksbündig | | -5d | 123456789 | ''123456789'' | mindestens fünf Stellen, linksbündig | | -5d | -10 | ''-10(sp)(sp)'' | mindestens fünf Stellen, linksbündig | | 05d | 10 | ''00010'' | mindestens fünf Stellen, rechtsbündig, mit Nullen aufgefüllt | | +5d | 10 | ''(sp)(sp)+10'' | mindestens fünf Stellen, rechtsbündig, mit Vorzeichen | | -+5d | 10 | ''+10(sp)(sp)'' | mindestens fünf Stellen, linksbündig, mit Vorzeichen | | x | 123 | ''7b'' | minimale Länge, Kleinbuchstaben | | X | 123 | ''7B'' | minimale Länge, Großbuchstaben | | 5X | 123 | ''(sp)(sp)(sp)7B'' | mindestens fünf Stellen, rechtsbündig, Großbuchstaben | | -5x | 2748 | ''abc(sp)(sp)'' | mindestens fünf Stellen, linksbündig, Kleinbuchstaben | | 05x | 2748 | ''00abc'' | mindestens fünf Stellen, linksbündig, Kleinbuchstaben, mit Nullen aufgefüllt | | .1f | 10,3456 | ''10,3'' | minimale Länge, mit einer Nachkommastelle | | .2f | 10,3456 | ''10,35'' | minimale Länge, mit zwei Nachkommastellen, gerundet | | 8.2f | 10,3456 | ''(sp)(sp)(sp)10,35'' | mindestens acht Stellen, rechtsbündig, mit zwei Nachkommastellen, gerundet | | -8.2f | 10,3456 | ''10,35(sp)(sp)(sp)'' | mindestens acht Stellen, linksbündig, mit zwei Nachkommastellen, gerundet | | 10.2F | 1234,5678 | ''(sp)(sp)1.234,57'' | mindestens zehn Stellen, rechtsbündig, mit zwei Nachkommastellen, Gruppierung der Vorkommastellen, gerundet | | 10.2F | 12345678,908 | ''12.345.678,91'' | mindestens zehn Stellen, rechtsbündig, mit zwei Nachkommastellen, Gruppierung der Vorkommastellen, gerundet | | b | 1234 | ''\x04\xD2'' | Ganze Zahl als zwei Byte | | 4b | 1234 | ''\x00\x00\x04\xD2'' | Ganze Zahl als vier Byte | | B | '1234' | ''\x12\x34'' | Zeichenkette als zwei Byte | | B | 'abCD' | ''\xAB\xCD'' | Zeichenkette als zwei Byte | | s | 'Hallo' | ''Hallo'' | minimale Länge | | 10s | 'Hallo' | ''(sp)(sp)(sp)(sp)(sp)Hallo'' | mindestens zehn Stellen, rechtsbündig | | -10s | 'Hallo' | ''Hallo(sp)(sp)(sp)(sp)(sp)'' | mindestens zehn Stellen, linksbündig | | 5s | 'Hallo Welt' | ''Hallo Welt'' | mindestens fünf Stellen | | 10.3s | 'Hallo' | ''(sp)(sp)(sp)(sp)(sp)(sp)(sp)Hal'' | drei Stellen in zehnstelligem Feld, rechtsbündig | | -10.3s | 'Hallo' | ''Hal(sp)(sp)(sp)(sp)(sp)(sp)(sp)'' | drei Stellen in zehnstelligem Feld, linksbündig | | .3s | 'Hallo' | ''Hal'' | maximal drei Stellen | \\ \\ ==== Hinweise ==== * Tatsächlich liegen alle Zahlen innerhalb (p2f), die aus den Nutzdaten entnommen werden, immer nur als Zeichenkette vor. Um diese Zahlen zu formatieren, müssen sie zunächst in ein internes 32-Bit Zahlenformat umgewandelt werden. * Bei ganzen Zahlen ergibt sich ein Zahlenbereich von −2.147.483.648 bis 2.147.483.647 und bei Zahlen mit Nachkommastellen ein Bereich von etwa 1.5E-45 bis 3.4E38 bei einer Genauigkeit von sieben bis acht Nachkommastellen. Es ist klar, daß bei der Darstellung als Zahl mit Nachkommastellen deshalb nicht alle Zahlen im Bereich exakt dargestellt werden können - es kommt zu Ungenauigkeiten in den letzten Stellen. * Je nach Schrift ist die Breite einer zur Auffüllung der Feldweite erzeugten Leerstelle identisch mit der einer Ziffer (Monospaced Schrift), oder nur halb so breit, wie eine Ziffer (typographische Schriften). Das ist zu berücksichtigen, wenn Zahlen innerhalb von Tabellen positioniert werden sollen.