Mit number_format() gestaltest du Zahlen lesbarer und passt sie exakt an die Bedürfnisse deiner Zielgruppe an. Ob Preisangaben mit Komma und Tausenderpunkt für den deutschen Markt oder Dezimalpunkt für englischsprachige Nutzer: Die Funktion übernimmt die Formatierung zuverlässig.

In diesem Tutorial lernst du die Syntax und alle Parameter kennen, siehst praxisnahe Beispiele von der Basisanwendung bis zum Warenkorb und erfährst, welche Fallstricke du vermeiden musst.
Was ist number_format() und warum ist es wichtig?
Die Funktion number_format() bereitet Fließkommazahlen und ganze Zahlen so auf, dass sie für Menschen leichter lesbar sind. Sie fügt Tausenderpunkte ein, setzt das passende Dezimaltrennzeichen und rundet auf die gewünschte Stellenzahl.
Typische Einsatzgebiete sind Preise und Rechnungsbeträge, Statistiken in Berichten und Diagramm-Labels sowie Zahlendarstellungen für verschiedene Sprachen und Länder. Mit dieser Funktion präsentierst du Werte übersichtlich und vermeidest Verwirrung durch uneinheitliche Trennzeichen.
<?php
/* Deutsches Format: Komma als Dezimal, Punkt als Tausender */
echo number_format(12345.6789, 2, ',', '.');
// Ausgabe: 12.345,68
/* Englisches Format: Punkt als Dezimal, Komma als Tausender */
echo number_format(12345.6789, 2, '.', ',');
// Ausgabe: 12,345.68
?>
Syntax und Parameter
Die Funktionssignatur von number_format() sieht so aus:
string number_format(
float $num,
int $decimals = 0,
string $decimal_separator = ".",
string $thousands_separator = ","
)
Parameter im Detail
Der erste Parameter $num ist die zu formatierende Zahl (float oder int). Der zweite Parameter $decimals legt die Anzahl der Nachkommastellen fest. Seit PHP 8.3 werden auch negative Werte unterstützt, die links vom Dezimalpunkt runden. Der dritte Parameter $decimal_separator bestimmt das Zeichen zwischen Ganzzahl und Nachkommastellen. Der vierte Parameter $thousands_separator definiert das Tausendertrennzeichen.
Wichtig: Die Funktion akzeptiert ausschließlich eine, zwei oder vier Argumente. Ein Aufruf mit drei Parametern führt zu einem Fehler.
Anwendungsbeispiele in der Praxis
Die folgenden Beispiele zeigen die wichtigsten Varianten von number_format().
Basisanwendung ohne Dezimalstellen
<?php
$zahl = 12345.6789;
echo number_format($zahl);
// Ausgabe: 12,346
?>
Ohne zweiten Parameter rundet number_format() auf die nächste Ganzzahl und setzt ein Komma als Tausendertrenner (englischer Standard).
Dezimalstellen festlegen
<?php
$zahl = 12345.6789;
echo number_format($zahl, 2);
// Ausgabe: 12,345.68
?>
Die Funktion rundet standardmäßig nach der Regel „round half up“. Für andere Rundungsarten kannst du die Zahl vorher mit round() behandeln.
Internationale Formate
Deutsches Format (Komma als Dezimal, Punkt als Tausender):
<?php
echo number_format(12345.6789, 2, ',', '.');
// Ausgabe: 12.345,68
?>
Französisches Format (Komma als Dezimal, Leerzeichen als Tausender):
<?php
echo number_format(12345.6789, 2, ',', ' ');
// Ausgabe: 12 345,68
?>
Rundung mit negativen Dezimalstellen (PHP 8.3+)
Seit PHP 8.3 akzeptiert number_format() negative Werte für $decimals. Damit rundest du links vom Dezimalpunkt:
<?php
echo number_format(1234.5678, -1);
// Ausgabe: 1,230 (auf Zehner gerundet)
echo number_format(1234.5678, -2);
// Ausgabe: 1,200 (auf Hunderter gerundet)
?>
Vor PHP 8.3 wurden negative Werte für den Dezimalstellen-Parameter stillschweigend ignoriert.
Praxisbeispiel: Warenkorb berechnen und formatieren
Der häufigste Anwendungsfall in der Praxis: Mehrere Positionen aufsummieren, Steuer berechnen und das Ergebnis formatiert ausgeben. Die wichtigste Regel dabei lautet: Erst mit den Rohwerten (float) rechnen, dann ganz am Ende formatieren.
<?php
$warenkorb = [
['name' => 'T-Shirt', 'preis' => 19.99, 'menge' => 2],
['name' => 'Jeans', 'preis' => 49.95, 'menge' => 1],
['name' => 'Sneaker', 'preis' => 79.90, 'menge' => 1],
];
$netto = 0;
foreach ($warenkorb as $pos) {
$netto += $pos['preis'] * $pos['menge'];
}
$mwst = $netto * 0.19;
$brutto = $netto + $mwst;
echo 'Netto: ' . number_format($netto, 2, ',', '.') . " €\n";
echo 'MwSt: ' . number_format($mwst, 2, ',', '.') . " €\n";
echo 'Brutto: ' . number_format($brutto, 2, ',', '.') . " €\n";
/* Netto: 169,83 €
MwSt: 32,27 €
Brutto: 202,10 € */
?>
Datenbank-Werte formatieren
Wenn du Preise aus einer MySQL-Datenbank liest (DECIMAL-Spalten), kommen die Werte als String an. Ein expliziter Cast auf (float) stellt sicher, dass number_format() korrekt arbeitet:
<?php
$stmt = $pdo->query('SELECT preis FROM produkte');
while ($row = $stmt->fetch()) {
$preis = (float)$row['preis'];
echo number_format($preis, 2, ',', '.') . " €\n";
}
?>
Formular-Eingaben zurückkonvertieren
Benutzer geben Zahlen oft im deutschen Format ein, zum Beispiel „1.234,56“. Bevor du damit rechnen kannst, musst du die Trennzeichen entfernen und den Dezimalpunkt setzen:
<?php
$eingabe = $_POST['betrag'] ?? '';
/* Punkt (Tausender) entfernen, Komma durch Punkt ersetzen */
$bereinigt = str_replace('.', '', $eingabe);
$bereinigt = str_replace(',', '.', $bereinigt);
/* In float umwandeln und validieren */
$betrag = filter_var($bereinigt, FILTER_VALIDATE_FLOAT);
if ($betrag === false) {
echo 'Ungültige Eingabe!';
} else {
$ergebnis = $betrag * 1.19;
echo number_format($ergebnis, 2, ',', '.') . ' €';
}
?>
Wichtige Hinweise und Fallstricke
Einige Eigenheiten von number_format() führen regelmäßig zu Fehlern. Wer sie kennt, vermeidet unnötige Debugging-Stunden.
Rückgabewert ist ein String
number_format() gibt immer einen String zurück. Das Ergebnis ist zur Anzeige gedacht und darf nicht für weitere Berechnungen verwendet werden:
<?php
$betrag = 999.95;
$formatiert = number_format($betrag, 2, ',', '.');
/* $formatiert ist "999,95" (String!) */
$summe = $formatiert + 5;
/* Warnung! PHP wandelt "999,95" in 999 um */
?>
Regel: Immer erst mit den Rohwerten rechnen, dann ganz am Ende formatieren.
Rundungsverhalten
Die Funktion verwendet die Standard-PHP-Rundung (round half up). Wenn du andere Rundungsmodi brauchst, runde die Zahl vorher mit round() und übergib das Ergebnis an number_format(). Zum reinen Auf- oder Abrunden stehen ceil() und floor() zur Verfügung.
Parameteranzahl: 1, 2 oder 4
Die Funktion akzeptiert nur einen, zwei oder vier Parameter. Ein Aufruf mit drei Parametern führt zu einem Fehler:
| Anzahl | Beschreibung | Beispiel |
| 1 | Nur die Zahl, Rundung auf Ganzzahl | number_format(1234.56) |
| 2 | Zahl + Dezimalstellen | number_format(1234.56, 2) |
| 4 | Zahl + Dezimalstellen + beide Trennzeichen | number_format(1234.56, 2, ",", ".") |
| 3 | Ungültig! Erzeugt einen Fehler | number_format(1234.56, 2, ",") |
Float-Präzision: Der Klassiker bei Preisberechnungen
Fließkommazahlen können in PHP nicht alle Dezimalwerte exakt darstellen. Das führt zu überraschenden Ergebnissen:
<?php
$summe = 0.1 + 0.2;
echo $summe;
// Ausgabe: 0.30000000000000004
echo number_format($summe, 1);
// Ausgabe: 0.3 (hier korrekt gerundet)
?>
Bei vielen aufeinanderfolgenden Berechnungen können sich die winzigen Abweichungen aufsummieren. Für Finanzanwendungen gibt es zwei bewährte Lösungen: Entweder rechnest du durchgehend in Cent (Integer-Arithmetik) oder du verwendest die BCMath-Erweiterung für exakte Dezimalrechnung:
<?php
/* Lösung 1: Integer-Cent-Rechnung */
$preisInCent = 1999; // 19,99 €
$menge = 3;
$summeInCent = $preisInCent * $menge;
echo number_format($summeInCent / 100, 2, ',', '.') . ' €';
// Ausgabe: 59,97 €
/* Lösung 2: BCMath */
$ergebnis = bcadd('0.1', '0.2', 2);
echo $ergebnis; // 0.30 (exakt)
?>
Nicht-numerische Eingaben
Übergibst du einen String oder nicht-numerischen Wert, gibt PHP eine Warnung aus und liefert „0“ zurück:
<?php
echo number_format("abc");
// Warnung + Ausgabe: 0
?>
Troubleshooting: Häufige Fehler lösen
Die folgenden Probleme tauchen in der Praxis immer wieder auf.
Zahl zeigt 0 an
Wenn number_format() nur „0“ ausgibt, ist die Eingabe vermutlich kein gültiger numerischer Wert. Prüfe den Datentyp mit var_dump() und stelle sicher, dass keine unsichtbaren Zeichen im String stecken.
Falsche Summe nach Formatierung
Wenn du mit dem formatierten String weiterrechnest, interpretiert PHP den Tausenderpunkt als Dezimaltrenner oder schneidet beim Komma ab. Lösung: Speichere den Rohwert (float) separat und formatiere erst bei der Ausgabe.
Komma statt Punkt aus Formulareingabe
Deutsche Benutzer geben „12,50“ statt „12.50“ ein. Konvertiere den Input vor der Berechnung mit str_replace(',', '.', $eingabe) und validiere anschließend mit filter_var().
NumberFormatter wirft einen Fatal Error
Die Klasse NumberFormatter benötigt die intl-Erweiterung. Prüfe mit extension_loaded('intl'), ob sie verfügbar ist. Auf vielen Shared-Hosting-Systemen ist sie nicht aktiv.
Alternativen zu number_format()
Je nach Anforderung gibt es bessere Werkzeuge als number_format().
sprintf() für spezielle Formate
Wenn du führende Nullen, feste Breiten oder spezielle Formatierungen brauchst, ist sprintf() die bessere Wahl:
<?php
echo sprintf("%09.2f", 123.4);
// Ausgabe: 000123.40
?>
NumberFormatter (intl-Erweiterung)
Für echte Internationalisierung mit automatischer Locale-Erkennung, Währungszeichen und länderspezifischen Gruppierungsregeln ist NumberFormatter die professionelle Lösung. Beachte, dass die intl-Erweiterung installiert und aktiviert sein muss:
<?php
if (extension_loaded('intl')) {
$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234567.89, 'EUR');
// Ausgabe: 1.234.567,89 €
} else {
/* Fallback ohne intl-Erweiterung */
echo number_format(1234567.89, 2, ',', '.') . ' €';
}
?>
money_format() (veraltet)
Diese Funktion wurde in PHP 7.4 als veraltet markiert und in PHP 8.0 entfernt. Verwende stattdessen NumberFormatter oder number_format() mit manuell angehängtem Währungszeichen.
Vergleich auf einen Blick
| Funktion | Locale | Währung | Verfügbarkeit | Ideal für |
| number_format() | Manuell | Nein | Immer | Einfache Formatierung |
| sprintf() | Nein | Nein | Immer | Führende Nullen, feste Breiten |
| NumberFormatter | Automatisch | Ja | intl-Erweiterung | Internationale Projekte |
Häufig gestellte Fragen
Hier findest du Antworten auf die gängigsten Fragen rund um number_format().
Wie runde ich eine Zahl in PHP richtig?
Verwende round() für die mathematische Rundung und number_format() für die formatierte Ausgabe. Rechne immer mit den Rohwerten und formatiere erst am Ende.
Wie entferne ich Tausendertrennzeichen, um mit einem String zu rechnen?
Entferne Trennzeichen mit str_replace() und wandle das Ergebnis in einen Float um:
<?php
$sZahl = "12.345,67";
$fWert = (float)str_replace(
['.', ','],
['', '.'],
$sZahl
);
// $fWert = 12345.67
?>
Warum erhalte ich eine falsche Summe nach number_format()?
Weil das Ergebnis ein String ist. PHP wandelt „12.345,67“ in die Zahl 12.345 um (stoppt beim Komma). Rechne immer mit den Original-Floatwerten.
Kann ich number_format() für Währungen verwenden?
Ja, aber ohne automatisches Währungssymbol. Du musst das Zeichen manuell anhängen. Für professionelle Währungsformatierung mit korrekter Platzierung des Symbols ist NumberFormatter die bessere Wahl.
Wie runde ich auf 5 Cent genau?
Kombiniere round() mit einem Faktor:
<?php
$betrag = 12.43;
$gerundet = round($betrag * 20) / 20;
echo number_format($gerundet, 2, ',', '.');
// Ausgabe: 12,45
?>
Fazit
number_format() ist das Standardwerkzeug in PHP, um Zahlen sauber und leserfreundlich darzustellen. Für die meisten Anwendungsfälle reicht die Funktion völlig aus. Denke immer daran, erst mit den Rohwerten zu rechnen und die Formatierung als allerletzten Schritt durchzuführen. Bei internationalen Projekten mit automatischer Locale-Erkennung und Währungszeichen lohnt sich der Umstieg auf NumberFormatter.