Formatierung mit printf()

Standard Ausgabe-Funktion in Perl, PHP, ...

Die Standard-Funktionen  printf()  und  sprintf()  werden von allen modernen Programmiersprachen angeboten. Man kann damit vielfältig formatierte Texte (Strings) aus konstanten und variablen Teilen erzeugen.
Programmierung mit Perl, PHP
Syntax der Funktionen printf und sprintf
Platzhalter Aufbau und Funktion eines Platzhalters
Ganze Zahlen Vorzeichen, Füllzeichen, Länge, Internes Format
Gleitkomma-Zahlen Genauigkeit, Komma-Punkt/Beistrich, Exponential-Format
Zahlen-Systeme Hexadezimal, Dezimal, Octal, Binär für ganze Zahlen
Zeichen ASCII-Zeichen, Unicode-Zeichen
IT-Beispiele Datum, Zeit, Farben (CSS), Sonderzeichen (Unicode)
Verwandte Themen printf() mit C/C++, Codierung & Decodierung mit pack() & unpack(), Umwandlung verschiedener Zahlen-Systeme.

Syntax der Funktionen printf() und sprintf()

Zweck

Funktion printf() gibt den erzeugten Text (String) an den Ausgabe-Kanal aus: Das ist bei PHP meist der QuellText einer Webseite, bei Perl oft auch ein Konsolen-Fenster.

Funktion sprintf() gibt den erzeugten Text an eine (String)-Variable zurück. Das ist sinnvoll, wenn der Text im Programm weiter bearbeitet werden soll.

Beide Funktionen werden in den Programmiersprachen → Perl und → PHP praktisch genau gleich verwendet. In der Programmiersprache → C/C++ werden sie mit der gleichen Bedeutung, jedoch geringfügig anderer Syntax verwendet.

Syntax

printf("format", $arg1, $arg2, ...);

$string = sprintf("format", $arg1, $arg2, ...);

Der obligatorische "format"-String ist eine Art Mini-Programm, in welchem festgelegt wird, wie der zu erzeugende Text formatiert werden soll.

Alle weiteren folgenden Argumente sind optional: Man braucht sie für allfällige variable Bestandteile des Ausgabe-Strings.

String-Konstante

Im einfachsten Fall besteht der zu erzeugende Text nur aus fixen (konstanten) Bestandteilen. In diesem Fall ist der Text zur Gänze im Format-String enthalten, und man braucht keine weiteren Argumente.

In den meisten Fällen wird der Format-String mit der Escape-Folge \n (für 'Neue Zeile') abgeschlossen.
In PHP-Anwendungen enthält der Ausgabe-Text oft auch HTML-Elemente.
Beispiel
printf("Ein Seiten-Titel\n");
printf("Ein <b>HTML</b> Element <br />\n");
Ausgabe (an den Ausgabe-Kanal):
Ein Seiten-Titel
Ein <b>HTML</b> Element <br />
Ausgabe der 2. Zeile auf einer Webseite:
Ein HTML Element

Variable Bestandteile

Der Format-String enthält in diesem Fall einen oder mehrere ↓ Platzhalter:
Das sind besonders bezeichnete Text-Marken, die bei Ausführung des Programms durch den aktuellen Wert einer Variablen ersetzt werden.
Alle dazu benötigten Variablen müssen nach dem Format-String als Argumente der Funktion folgen.

Im Beispiel rechts enthält der Format-String den Platzhalter %d mit der Bedeutung: 'Ganze Dezimalzahl'.
Bei jeder Anwendung der Funktion (hier in einer Schleife) wird der Platzhalter durch den aktuellen (!) Wert der Variablen $i ersetzt.
Beispiel
for($i=0;$i<=3;$i++) {
printf("i=%d \n",$i);
}
Ausgabe:
i=0
i=1
i=2
i=3
Der Format-String enthält die konstanten Bestandteile "i=" und "\n" - sie kommen in jeder Anwendung vor.
Der Platzhalter %d wird dagegen durch jenen Wert ersetzt, den die angegebene Variable $i jeweils gerade hat.

Platzhalter

Ein Platzhalter ist ein besonders bezeichneter (Teil)-String innerhalb eines Format-Strings.
Als Kennzeichen dient das % Zeichen, mit dem (nur in einem Format-String) jeder Platzhalter beginnt.

Ein Format-String kann beliebig viele verschiedene Platzhalter enthalten, in beliebiger Reihenfolge und gemischt mit konstanten Text-Bestandteilen. Das bedingt die enorme Flexibilität der Funktionen printf() und sprintf()
Da jeder einzelne Platzhalter bei Ausführung des Programms durch den Wert einer Variablen ersetzt wird, muss die Liste der Variablen nach dem Format-String genauso viele Variable enthalten, als Platzhalter angeführt wurden.

Ein Platzhalter hat 2 fixe und mehrere optionale Bestandteile. Aufbau und Anordnung dieser Teile sind an eine strenge Syntax gebunden. Betrachten sie einen Platzhalter als ein Mini-Programm zur Formatierung einer einzigen Variablen.
Bestandteile eines Platzhalters
(genau in dieser Reihenfolge):
%-Zeichen (obligatorisch)
Vorzeichen (+ optional) für Zahlen >=0
Füllzeichen (padding, optional, meist 0 )
Ausrichtung (optional) - für linksbündig
Breite (optional) in Zeichen als ganze Zahl
Präzision (optional) als ganze Zahl
Type (obligatorisch, aus Spalte T der Tabelle rechts)

Jeder Format-String steuert die Formatierung genau einer Variablen.
Alle anderen Zeichen eines Format-Strings werden direkt in den Ausgabe-Text eingesetzt, d.h. 'so wie sie sind'.
Typen-Liste
TBedeutungArgument
%% Zeichenkein Argument
bBinärGanze Zahl (Integer)
cZeichenASCII-Code (Integer 0..255)
dDezimal-ZahlGanze Zahl (Integer)
eWiss.FormatGleitkomma-Zahl
fGleitkommaGleitkomma-Zahl, lokal
FGleitkommaGleitkomma-Zahl
oOctal-ZahlGanze Zahl (Integer)
sTextText (String)
uDezimal-ZahlGanze Zahl (Unsigned)
xhex-ZahlGanze Zahl (Integer)
XHex-ZahlGanze Zahl (Integer)

Formatierung von ganzen Zahlen

Ganze Dezimalzahlen

Negative Zahlen erhalten automatisch das - Vorzeichen.
Bei positiven Zahlen kann man mit + ein Vorzeichen erzwingen.
Das Vorzeichen kostet jeweils 1 Zeichen der Breite.
Als Füllzeichen sind nur 0 oder Leerzeichen sinnvoll.
Wenn die gewünschte Breite nicht ausreicht, dann werden die Zahlen nicht abgeschnitten (Beispiel 12345).
Die Darstellung in anderen Zahlensystemen ↓ (Hex, Oct, Bin) ist möglich.
ZahlFormatErgebnis
123"%d"123
"%05d"00123
"%+05d"+0123
-34"%d"-34
"%05d"-0034
"%2d"-34
12345"%2d"12345

Unsigned

Die Darstellung des internen Zahlen-Formats ist nur in der Informatik üblich und verständlich !
Die ganze Zahl wird in der zum Speichern verwendeten Wort-Breite dargestellt, normalerweise mit 4 Byte = 32 Bit. Das bedeutet:
Positive Zahlen bis 232-1 werden genauso dargestellt wie mit "%d"
Von größeren positive Zahlen werden die überzähligen Bits abgeschnitten.
Negative Zahlen werden im → 2er-Komplement dargestellt.
ZahlFormatErgebnis
1"%u"1
0"%u"0
-1"%u"4294967295
-2"%u"4294967294
4294967295"%u"4294967295
4294967296"%u"0
4294967297"%u"1

Formatierung von Gleitkomma-Zahlen

Standard Gleitkomma Darstellung

Mit %f werden die meisten Gleitkomma-Zahlen formatiert. Nach Angabe der Länge folgt ein (Dezimal)-Punkt und die Anzahl der Nachkomma-Ziffern.
Die Präzision (Zahl nach dem Punkt) bezeichnet die Anzahl der Nachkomma-Stellen.
Wenn die gewünschte Breite nicht ausreicht, dann werden die Zahlen (vor dem Komma) nicht abgeschnitten. Man kann das ausnutzen, um eine variable (minimale) Breite bei fixer Präzision (Kommastellen) zu erreichen.
ZahlFormatErgebnis
π"%f"3.141593
"%6.2f"3,14
"%+06.2f"+03.14
1000/3"%2.1f"333.3
-1/3"%f"-0.333333

Dezimal-Trennzeichen

International wird nur der Komma-Punkt verwendet.
Lediglich im deutschen Sprachraum ist ein Komma-Beistrich üblich. Das verursacht zahlreiche Probleme und Fehler, und kostet viel Zeit & Geld ...
Theoretisch sollte %F das internationale, %f das nationale Komma-Zeichen liefern. Wegen der zahlreichen Verwechslungen sind jedoch fast alle Systeme so konfiguriert, dass immer das internationale Zeichen (Punkt) erzeugt wird.
Bei Verwendung (von Perl oder PHP) am Webserver würde dessen Konfiguration verwendet, nicht jene am Client-PC !
Tipp: Formatieren sie immer mit Dezimal-Punkt und wandeln sie den String bei Bedarf mit einem → Regulären Ausdruck um.
DatenFormatErgebnis
π"%f"3.141593
"%F"3.141593

$r = pi();
$sp = sprintf('%f',$r);
// Perl:
$sc = $sp;   $sc =~ s/\./,/;
// PHP:
$sc = preg_replace('/\./',',',$sp);
Ergebnis: $sc = '3,141593'

Prozent

Das Wort "Prozent" bedeutet "von Hundert". Zahlen-Werte 0..1 entsprechen daher 0%..100%
In gängigen Programmiersprachen muss man die %-Zahlenwerte durch Multiplikation *100 selbst berechnen !
Kalkulations-Programme (LibreOffice, OpenOffice, Excel, ...) arbeiten unterschiedlich - Dort bleiben die Zahlen-Werte erhalten, die Formatierung betrifft nur die Darstellung.
DatenFormatErgebnis
$p=0.2;"%d%%", $p*10020%
$p=-0.1;"%+d%%", $p*100-10%

Einheiten

Zusätzliche Angaben werden als Klartext in den Format-String eingefügt.
Dabei kann man auch Variable (hier $u) verwenden.
Vorsicht mit Sonderzeichen wie µ € usw.: Man kann sie je nach Zeichensatz unterschiedlich codieren. Beispiele im Kapitel ↓ Unicode dieser Seite.
Bei Währungen wird die Einheit manchmal vorangestellt. In diesem Fall muss man die Feld-Breite angeben.
Details zu Zeichen-Codes (ASCII, HTML, Unicode)
DatenEinheitFormatErgebnis
123.456m"%d m"123 m
$u="&euro;" "%1.2f $u"123.46 €
"$u %7.2f"€ 123.46

Exponential-Format

Mit %e werden Zahlen im 'wissenschaftlichen Format' dargestellt, d.h. als Gleitkomma → Mantisse mit Dezimal → Exponent.
Dieses Format eignet sich besonders für sehr kleine oder sehr große Zahlen. Ein Nachteil ist der vergleichsweise große Bedarf an 'Overhead' (Vorzeichen der Mantisse, Dezimalpunkt, e, Vorzeichen des Exponenten). Man muss daher für die Breite (Anzahl aller Zeichen) meist mehr Zeichen vorsehen.
Die Präzision (Zahl nach dem Punkt) bezeichnet die Anzahl signifikanter Ziffern und muss >0 sein. Da genau 1 Ziffer vor dem Komma steht, ist die Anzahl der Nachkomma-Stellen um -1 geringer.
Tipp: Ausreichend Breite vorsehen, meist >=10 Zeichen !
ZahlFormatErgebnis
π"%e"3.14159e+0
"%10.3e"3.14e+0
1000/3"%2.1f"333.3
-1/3"%e"-3.33333e-1
"%10.3e"-3.33e-1
Auch Strings im Exponential-Format lassen sich nachträglich ändern.
Zunächst wird ein String $sp der gewünschten Präzision erzeugt.
Der String wird mit einem → Regulären Ausdruck in 3 Teile geteilt:
Vorzeichen und 1. Ziffer der Mantisse (vor dem Punkt)
Rest der Mantisse (Nachkomma-Stellen)
Exponent inkl. Vorzeichen
Danach wird der String erneut zusammengesetzt. Im Beispiel werden dabei folgende Details geändert:
Dezimal-Beistrich statt Punkt
Exponent mit E statt e
Exponent fixer Länge (hier 3 Stellen)

Alternativ man die Strings auch komplett selbst erzeugen:
Trennung einer Zahl in Mantisse und Exponent, Formatierung beider Teile, Zusammenfügen der Strings.
Beispiel: Dezimal-Beistrich und 3stelliger Exponent (PHP):
$x = 10 * pi();
$sp = sprintf('%e',$x);
// $sp = '3.14159e+1'
$re = "/^([^\.]*)\.([^e]*)e(.*)$/";
if( preg_match($re, $sp, $regs) ) {
$m1 = $regs[1]; // 3
$m2 = regs[2]; // 14159
$e = regs[3]+0; // +1
$e2 = sprintf('%+04d',$e)
$sc = $m1.','.$m2.$e2;
// $sc = '3,14159E+001'
}

Zahlen-Systeme (Dec, Hex, Oct, Bin)

Zahlen-Systeme

Ganze Zahlen kann man in allen für die Informatik wichtigen Zahlen-Systemen darstellen:
Mit %d wird die Zahl als Dezimal-Zahl (Basis 10) dargestellt.
Tipp: Keine führende Nullen verwenden, sonst oft Verwechslung mit Octal-Zahlen. Im Zweifel einen Punkt nachstellen.
Mit %X werden Hexadezimal-Zahlen (Basis 16) dargestellt. Zur Kennzeichnung wird entweder # oder 0x vorangestellt. Man verwendet immer eine fixe Breite (2,4,8 Zeichen) und führende Nullen. %x ergibt kleine Buchstaben für die Ziffern a..f
Mit %o werden Octal-Zahlen (Basis 8) dargestellt. Zur Kennzeichnung wird 0 (Null) vorangestellt. Vorsicht - Das gibt oft Anlass zu falscher Interpretation !
Mit %b werden Binär-Zahlen (Basis 2) dargestellt.
Tipp: Verwenden sie immer eine fixe Breite (Vielfache von 4 oder 8) und trennen sie die Zeichen-Gruppen mit Leerzeichen. - Das erfordert ein eigenes kleines Programm.
Details zu Zahlen-Systemen.
ZahlFormatErgebnis
256"%d"256
"%X"100
"%o"400
"%b"100000000
127"%d."127.
"#%X"#7F
"#%x"#7f
"#%04X"#007F
"0x%X"0x7F
"0%o"0177

Decodierung

Zur Decodierung (z.B. Hex -> Dec) verwendet man am besten die Perl Funktionen → pack() und unpack(), die auch von PHP geboten werden.
Darüber hinaus bieten die einzelnen Programmiersprachen zahlreiche uneinheitliche Funktionen an, z.B. Javascript (parseInt()), PHP (bindec(), hexdec(), octdec(), base_convert())
Details zu pack() und unpack() sowie allgemein zur Programmierung veschiedener Zahlensysteme.

Zeichen

Mit %c wird das Argument (Ganze Zahl) als ASCII-Zeichen codiert. Beschränken sie daher die Zahl auf 0..127 oder noch besser auf 32..126 (druckbare Zeichen ohne Steuerzeichen).

Tipp: Zusätzlich kann man auch (mindestens 65000) → Unicode-Zeichen verwenden. Diese müssen je nach Anwendung unterschiedlich codiert werden. ↓ Beispiele zur Codierung von Unicode-Zeichen für HTML und Javascript.

Details zum ASCII Zeichen-Code
ZahlFormatErgebnis
65'%c'A
66B
97a
122z
491

Beispiele

Datum & Zeit

Das Beispiel zeigt die aktuellen Daten im Standard → ISO-8859 Format.
Tipp: Verwenden sie nach Möglichkeit Formate mit fixer Anzahl von Zeichen - In diesem Fall immer mit Angabe der Breite und mit führenden Nullen.
Vorsicht bei der Analyse solcher Strings: Zahlen mit führenden Nullen werden ohne zusätzliche Maßnahmen meist als ↑ Octal-Zahlen interpretiert !
Details zum Thema Datum & Zeit
DatenFormatErgebnis
$yy,$mo,$dd"%4d-%02d-%02d"
yyyy:mo:dd
$hh,$mi,$ss"%02d:%02d:%02d"
hh:mi:ss

Farben

werden normalerweise aus den Anteilen der 3 "Grundfarben" Rot, Grün, Blau (RGB) zusammengesetzt. Jeder der 3 Farb-Werte wird durch eine ganze Zahl 0..255 bezeichnet.
Das Beispiel zeigt die Codierung in den beiden meist verwendeten Formaten für → CSS.
Zufalls-Farbe

Details zum Thema Farben
DatenFormatErgebnis
$r,$g,$b
           
"rgb(%d,%d,%d"
rgb(rr,gg,bb)
 
"#%02X%02X%02X"
#rrggbb

Unicode

ist ein Standard zur Darstellung 'aller' weltweit verwendeten Zeichen. Die meisten IT-Systeme können zumindest die ersten 65000 Zeichen verwenden. - Das entspricht einer 4-stelligen Hexadezimal-Zahl #0000..#FFFF
Das Beispiel zeigt die übliche Unicode-Kennzeichnung mit U+, die HTML-Codierung und die Javascript-Codierung.
Ganz rechts die reale Darstellung des Zeichens.
Details zum Thema Unicode
DatenFormatErgebnis
931"U+%04X"U+03A3Σ
8364"&#x%X;"&#x20AC;
8734"\u%04X\u221E