Funktion printf() - Formatierte Zeichenketten ausgeben

Im PHP-Code ist in der Regel an vielen Stellen vorgesehen, dass Zeichenketten am Bildschirm ausgegeben werden. Der wahrscheinlich am häufigsten genutzte Befehl hierfür ist echo. Daneben gibt es noch den print-Befehl, der einen Rückgabewert liefert. In manchen Fällen möchte man jedoch eine formatierte Ausgabe. Wenn z.B. eine Variable die Fließkommazahl 10.123 enthält und man diese ohne Nachkommastellen ausgeben möchte, benötigt man eine Funktion, um die Variable in einen Integer-Wert umzuwandeln oder die Nachkommastellen zu entfernen. Und wenn die Verarbeitung im weiteren Verlauf mit der Fließkommazahl durchgeführt werden soll, erfolgt unter Umständen eine erneute Umwandlung oder man behelft sich mit einer weiteren Variable zum Speichern des Werts ohne Nachkommastellen.

Das alles bedeutet viel Arbeit, die man sich mit der Funktion printf() ersparen kann. Damit wird eine Ausgabe durchgeführt, bei der man das Ausgabeformat vorgeben kann. Innerhalb der runden Klammern wird im ersten Teil die Zeichenkette mit den gewünschten Formaten und als zweiten Block mit Komma getrennt die dazugehörigen Argumente angegeben. Die Formate gibt man dabei in Form von Platzhaltern mit einem Prozentzeichen % an, z.B. %d für einen Integerwert. Beim folgenden Beispiel enthält die Variable $zahl die Fließkommazahl 10.123 und durch die Angabe des Formats mit %d wird am Bildschirm trotzdem die Ganzzahl 10 ausgegeben. Dadurch spart man sich viele Umwandlungen.

<?php

$zahl = 10.123;

// Ausgabe: Text mit der Zahl 10
printf('Text mit der Zahl %d', $zahl);

?>

In einer Zeichenkette können auch mehrere Variablen formatiert ausgegeben werden. Dabei gilt die Zuordnung nach der Reihenfolge, die man angegeben hat. Beim folgenden Beispielcode gilt das Format %d für die Variable $zahl1 und %F für $zahl2. Mit %F wird eine Variable als Fließkommazahl ausgegeben.

<?php

$zahl1 = 10.123;
$zahl2 = 10;

// Ausgabe: Text mit der Zahl 10 und 10.000000
printf('Text mit der Zahl %d und %F', $zahl1, $zahl2);

?>

Format-Spezifikation mit %

Eine gute Frage ist, woher man weiß, dass z.B. %d für einen Integerwert gilt. Jeder Formatierungshinweis beginnt mit einem Prozentzeichen, gefolgt von einem oder mehreren Zeichen. Man nennt sie auch Format-Spezifikator. Diese sind standardisiert und die Bedeutung ist wie folgt.

  • %% - Für die Ausgabe von normalen Prozentzeichen werden diese mit einem weiteren Prozentzeichen maskiert, damit der PHP-Interpreter sie nicht als Format-Spezifikator behandelt.
  • %b - Das Argument wird als Integer angesehen und binär ausgegeben.
  • %c - Das Argument wird als Integer angesehen und das zugehörige ASCII-Zeichen wird ausgegeben.
  • %d - Das Argument wird als Integer angesehen und als vorzeichenbehafteter Dezimalwert ausgegeben.
  • %e - Das Argument wird als wissenschaftliche Notation angesehen und ausgegeben, z.B. 1.234e+3.
  • %E - Wie %e, nur mit dem Unterschied, dass das E in Großbuchstaben ausgegeben wird, z.B. 1.234E+3.
  • %f - Das Argument wird als Fließkommazahl angesehen und dementsprechend ausgegeben (abhängig von den locales).
  • %F - Wie %f, nur unabhängig von den Einstellungen in den locales. Ab PHP 4.3.10 und 5.0.3.
  • %g - Wie %e oder %f, je nachdem welche die kürzere ist.
  • %G - Wie %E oder %f, je nachdem welche die kürzere ist.
  • %o - Das Argument wird als Integer angesehen und oktal ausgegeben.
  • %s - Das Argument wird als String angesehen und dementsprechend ausgegeben.
  • %u - Das Argument wird als Integer angesehen und als positiver Dezimalwert ohne Vorzeichen ausgegeben.
  • %x - Das Argument wird als Integer angesehen und in Kleinbuchstaben als Hexadezimalwert ausgegeben.
  • %X - Wie %x, nur dass der Hexadezimalwert in Großbuchstaben ausgegeben wird.

Im nachfolgenden Code ist jeweils ein Beispiel mit den Format-Spezifikatoren.

<?php

$zahl = 10.9;

// Ausgabe: Text nur mit %
printf('Text nur mit %%');

// Ausgabe: 1010, entspricht 10
printf('%b', $zahl);

// Ausgabe: A, entspricht ASCII-Wert 65
printf('%c', $zahl + 55);

// Ausgabe: -10, Zahl 10 * -1 = -10
printf('%d', $zahl * -1);

// Ausgabe: 1.090000e+1 entspricht 10.9
printf('%e', $zahl);

// Ausgabe: 1.090000e+1 entspricht 10.9
printf('%E', $zahl);

// Ausgabe: 10.000000
printf('%f', $zahl - 0.9);

// Ausgabe: 10.900000
printf('%F', $zahl);

// Ausgabe: 10.9
printf('%g', $zahl);

// Ausgabe: 5.45E+8
printf('%G', $zahl * 50000000.123456789);

// Ausgabe: 12, entspricht dezimal 10
printf('%o', $zahl);

// Ausgabe: 10.9
printf('%s', $zahl);

// Ausgabe: 18446744073709551606
printf('%u', $zahl * -1);

// Ausgabe: a, entspricht 10
printf('%x', $zahl);

// Ausgabe: A, entspricht 10
printf('%X', $zahl);

?>

Vorzeichen anzeigen

Positive Zahlen werden ohne Vorzeichen dargestellt. Das kann man ändern, indem man vor dem Buchstaben ein Pluszeichen + setzt. Funktioniert nicht, wenn es unpassend ist, z.B. mit %+s, da Strings ohne Vorzeichen sind.

<?php

$zahl = 10.9;

// Ausgabe: +10
printf('%+d', $zahl);

?>

Mit Füllzeichen versehen

Man kann die Werte auch mit führenden Nullen versehen. Hierbei gibt man die 0 und die Anzahl der Stellen an, die ein Wert mindestens haben soll. Ein führendes Pluszeichen wird dabei mit eingerechnet. Es ist auch möglich, andere Füllzeichen zu verwenden. Hierfür wird das Füllzeichen mit \' maskiert, wenn die Zeichenkette in einfachen Anführungszeichen gesetzt wurde oder nur mit einem einfachen Anführungszeichen, falls die Zeichenkette in doppelte Anführungszeichen gesetzt wurde.

<?php

$zahl = 10.9;

// Ausgabe: +0010
printf('%+05d', $zahl);

// Ausgabe: 00010
printf('%05d', $zahl);

// Ausgabe:    10 (mit 5 Leerzeichen)
printf('% 5d', $zahl);

// Ausgabe:    10 (mit 5 Leerzeichen)
printf('%5d', $zahl);

// Ausgabe: ***10
printf('%\'*5d', $zahl);

// Ausgabe: AAA10
printf('%\'A5d', $zahl);

// Ausgabe: AAA10
printf("%'A5d", $zahl);

?>

Nachkommastellen festlegen

Wenn man die Werte als Fließkommazahl ausgeben lässt, dann werden diese standardmäßig mit 6 Nachkommastellen angezeigt. Das kann beeinflusst werden, indem man einen Punkt und die Anzahl der Nachkommastellen vor dem Buchstaben einsetzt. Ein Vorzeichen hat dabei keinen Einfluss. Lässt man die Werte zusätzlich mit führenden Nullen (oder anderen Zeichen) füllen, dann werden für die Zählung die Nachkommastellen inkl. dem Dezimalpunkt berücksichtigt. Beim Format %s werden die Strings nach der Anzahl der Zeichen abgeschnitten, die man als Nachkommastelle angegeben hat.

<?php

$zahl = 10.9;

// Ausgabe: +10.900
printf('%+.3f', $zahl);

// Ausgabe: 10.900
printf('%.3f', $zahl);

// Ausgabe: 10.90000000
printf('%.8f', $zahl);

// Ausgabe: 010.900
printf('%07.3f', $zahl);

$text = 'Zeichenkette';

// Ausgabe 0000Zei
printf('%07.3s', $text);

?>

Reihenfolge der Argumente festlegen

Normalerweise gilt der erste Format-Spezifikator für das erste Argument, der zweite für das zweite Argument usw. Falls man davon abweichen möchte, kann man die Reihenfolge auch selbst vorgeben. Hierfür verwendet man ein Dollarzeichen $ und davor eine Zahl, mit der das Argument angegeben wird, für das es gelten soll.

<?php

$a = 10.5;
$b = 20.5;
$c = 30.5;
$d = 40.5;

// Ausgabe: 10 20 30 40
printf('%d %d %d %d', $a, $b, $c, $d);

// Ausgabe: 40 30 20 10
printf('%4$d %3$d %2$d %1$d', $a, $b, $c, $d);

?>

Rückgabewert der Funktion printf()

Falls man den Rückgabewert der Funktion printf in einer Variable speichert und ausgibt, erhält man nicht die Zeichenkette, sondern die Anzahl der Bytes, die von der Zeichenkette belegt werden. Hierbei gilt nicht immer 1 Byte für jedes Zeichen. Umlaute belegen in UTF-8 beispielsweise 2 Bytes. Beim folgenden Beispiel werden 4 Zeichen ausgegeben, die jeweils 2 Bytes belegen. Zuzüglich den Leerzeichen erhält man die Zahl 11 als Rückgabewert.

<?php

$a = 'ä';
$b = 'ö';
$c = 'ü';
$d = 'ß';

// Ausgabe: ä ö ü ß
$ergebnis = printf('%s %s %s %s', $a, $b, $c, $d);

// Ausgabe 11
echo $ergebnis;

?>

Falls man nicht die Bytes erhalten möchte, die die Zeichen belegen, sondern die Zeichenkette, kann man die Funktion sprintf() verwenden. Sie funktioniert im Grunde genauso wie printf(), nur mit dem Unterschied, dass der Rückgabewert die Zeichenkette ist. Diesen kann man dann z.B. einer Variable zuweisen und weiter verarbeiten. Das ist mit printf() nicht möglich.