Wer in PHP Zahlen mit einer bestimmten Anzahl an Nachkommastellen, führenden Nullen oder in einem festen Textmuster ausgeben möchte, greift zu sprintf(). Die Funktion setzt Werte in einen Format-String ein und gibt das Ergebnis als Zeichenkette zurück. Das ist deutlich flexibler als eine Verkettung mit dem Punkt-Operator und sorgt für übersichtlichen Code.
Grundlegende Syntax
Der erste Parameter von sprintf() ist der Format-String. Er enthält normalen Text und Platzhalter, die mit einem Prozentzeichen beginnen. Jeder Platzhalter wird durch den jeweils nächsten Wert ersetzt.
<?php
$name = 'Max';
$alter = 28;
$text = sprintf('Hallo %s, du bist %d Jahre alt.', $name, $alter);
echo $text;
/* Ausgabe: Hallo Max, du bist 28 Jahre alt. */
?>
In diesem Beispiel steht %s für einen String und %d für eine Ganzzahl. Die Werte werden in der Reihenfolge eingesetzt, in der sie als Parameter übergeben werden.
Die wichtigsten Platzhalter
Jeder Platzhalter beginnt mit % und endet mit einem Buchstaben, der den Datentyp bestimmt. Hier eine Übersicht der gängigsten Typen:
<?php
$zahl = 255;
echo sprintf('%d', $zahl); // 255 (Ganzzahl)
echo sprintf('%f', $zahl); // 255.000000 (Gleitkommazahl)
echo sprintf('%s', $zahl); // 255 (String)
echo sprintf('%b', $zahl); // 11111111 (Binär)
echo sprintf('%x', $zahl); // ff (Hexadezimal klein)
echo sprintf('%X', $zahl); // FF (Hexadezimal groß)
echo sprintf('%o', $zahl); // 377 (Oktal)
echo sprintf('%e', $zahl); // 2.550000e+2 (Exponential)
?>
Am häufigsten werden %s, %d und %f verwendet. Die anderen Formate sind vor allem bei technischen Ausgaben oder bei der Arbeit mit Farbcodes nützlich.
Nachkommastellen steuern mit %.Nf
Bei Gleitkommazahlen gibt sprintf() standardmäßig sechs Nachkommastellen aus. Mit der Angabe %.Nf lässt sich die Anzahl der Nachkommastellen festlegen, wobei N die gewünschte Stellenzahl ist.
<?php
$preis = 19.5;
echo sprintf('%.2f', $preis);
/* Ausgabe: 19.50 */
echo sprintf('%.0f', $preis);
/* Ausgabe: 20 (gerundet) */
echo sprintf('%.4f', $preis);
/* Ausgabe: 19.5000 */
?>
Das ist besonders bei der Ausgabe von Geldbeträgen praktisch. Mit %.2f werden immer genau zwei Nachkommastellen angezeigt, unabhängig davon, ob der Wert 19.5 oder 19.99 lautet.
Mindestbreite und führende Nullen
Zwischen dem Prozentzeichen und dem Typbuchstaben kann eine Mindestbreite angegeben werden. Der Wert wird dann bei Bedarf mit Leerzeichen aufgefüllt. Steht eine Null vor der Breitenangabe, wird stattdessen mit Nullen aufgefüllt.
<?php
$tag = 5;
$monat = 3;
$jahr = 2026;
echo sprintf('%02d.%02d.%04d', $tag, $monat, $jahr);
/* Ausgabe: 05.03.2026 */
echo sprintf('%05d', 42);
/* Ausgabe: 00042 */
echo sprintf('%10s', 'rechts');
/* Ausgabe: rechts (mit Leerzeichen aufgefüllt) */
echo sprintf('%-10s|', 'links');
/* Ausgabe: links | (linksbündig) */
?>
Das Minuszeichen vor der Breitenangabe bewirkt eine linksbündige Ausrichtung. Ohne Minus wird rechtsbündig aufgefüllt.
Praxisbeispiel: Preise ausgeben
Eine häufige Aufgabe in Webshops und Rechnungen ist die einheitliche Darstellung von Preisen. Mit sprintf() lässt sich das elegant lösen.
<?php
$netto = 84.034;
$mwst = $netto * 0.19;
$brutto = $netto + $mwst;
echo sprintf(
'Netto: %8.2f EUR' . "\n"
. 'MwSt: %8.2f EUR' . "\n"
. 'Brutto: %8.2f EUR',
$netto,
$mwst,
$brutto
);
/*
Ausgabe:
Netto: 84.03 EUR
MwSt: 15.97 EUR
Brutto: 100.00 EUR
*/
?>
Durch die feste Breite %8.2f sind alle Zahlen rechtsbündig ausgerichtet und die Dezimalpunkte stehen exakt untereinander.
Argumente per Position referenzieren
Normalerweise werden die Parameter der Reihe nach den Platzhaltern zugeordnet. Mit der Schreibweise %1$s kann ein bestimmter Parameter gezielt angesprochen werden. Die Zahl vor dem Dollarzeichen gibt die Position an (beginnend bei 1).
<?php
$vorname = 'Anna';
$nachname = 'Müller';
echo sprintf(
'%1$s %2$s (Nachname: %2$s)',
$vorname,
$nachname
);
/* Ausgabe: Anna Müller (Nachname: Müller) */
?>
Das ist vor allem bei Übersetzungen nützlich, weil in anderen Sprachen die Wort-Reihenfolge abweichen kann. Der Format-String lässt sich anpassen, ohne die Parameter-Reihenfolge zu ändern.
printf() und fprintf()
Neben sprintf() gibt es zwei verwandte Funktionen. printf() arbeitet identisch, gibt das Ergebnis aber direkt aus statt es zurückzugeben. fprintf() schreibt das formatierte Ergebnis in eine Datei oder einen Stream.
<?php
/* Direkte Ausgabe mit printf() */
printf('Heute ist der %02d.%02d.%04d', 24, 2, 2026);
/* In Datei schreiben mit fprintf() */
$datei = fopen('log.txt', 'a');
fprintf($datei, '[%s] %s' . "\n", date('H:i:s'), 'Vorgang abgeschlossen');
fclose($datei);
?>
sprintf() oder Punkt-Verkettung?
Für einfache Fälle reicht die Verkettung mit dem Punkt-Operator völlig aus. sprintf() lohnt sich vor allem dann, wenn Zahlen formatiert werden müssen, wenn derselbe Wert mehrfach eingesetzt wird oder wenn der Format-String übersichtlicher ist als eine lange Verkettungskette.
<?php
$name = 'Max';
$punkte = 7.5;
/* Verkettung */
echo $name . ' hat ' . number_format($punkte, 1)
. ' von 10 Punkten.';
/* sprintf */
echo sprintf('%s hat %.1f von 10 Punkten.', $name, $punkte);
/* Beide Zeilen geben dasselbe aus:
Max hat 7.5 von 10 Punkten. */
?>
Für die reine Zahlenformatierung mit Tausendertrennzeichen und angepasstem Dezimaltrennzeichen ist übrigens number_format() oft die bessere Wahl. Während sprintf('%.2f', 1234.5) den Wert 1234.50 liefert, erzeugt number_format(1234.5, 2, ',', '.') die im deutschen Sprachraum übliche Schreibweise 1.234,50.