Menu

PHP number_format(): Tausendertrennzeichen und Dezimalen

number_format(1234567.891, 2) liefert "1,234,567.89": Es rundet auf die angegebenen Nachkommastellen und fügt ein Tausendertrennzeichen ein. Hier: die vier Parameter, europäische und japanische Formate, wie es rundet und warum das Ergebnis ein String ist.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

number_format($number, $decimals) liefert die Zahl als String mit Tausendertrennzeichen und einer festen Anzahl von Nachkommastellen: number_format(1234567.891, 2) liefert "1,234,567.89". Mit einem Argument rundet es auf eine ganze Zahl: number_format(1234567.891) ist "1,234,568".

Die vier Parameter

number_format(
    float $num,
    int $decimals = 0,
    ?string $decimal_separator = ".",
    ?string $thousands_separator = ","
): string

Das dritte Argument ist das Zeichen zwischen ganzzahligem Teil und Nachkommastellen, das vierte das Zeichen zwischen den Dreiergruppen von Ziffern. Beide können ein beliebiger String sein, auch ein leerer oder ein Multibyte-Zeichen. Ändere die Trennzeichen unten, um jede Schreibweise zu sehen:

Locale-Daten (CLDR) verwenden für Französisch ein schmales geschütztes Leerzeichen (U+202F) und für Russisch ein geschütztes Leerzeichen (U+00A0), damit eine Zahl nie über zwei Zeilen umbricht. In HTML übergibst du "\u{202F}" oder "\u{00A0}" als Trennzeichen statt eines einfachen Leerzeichens.

Eine Zahl ohne Tausendertrennzeichen formatieren

Übergib '' als viertes Argument. Du bekommst eine einfache Zahl mit fester Anzahl von Nachkommastellen, die Form, die Zahlungs-Gateways, CSV-Exporte und Werte von <input type="number"> erwarten:

Für die letzte Zeile ist round() vor dem Cast wichtig: 19.9 * 100 wird als 1989.9999999999998 gespeichert, und (int) allein würde es auf 1989 abschneiden.

Wie number_format rundet

number_format() rundet Hälften von null weg, so wie round(), also wird 0.5 zu 1 und -2.5 zu -3. Es korrigiert außerdem den winzigen binären Fehler in Werten wie 2.675, weshalb es von sprintf('%.2f') abweichen kann:

2.675 lässt sich binär nicht exakt speichern; der gespeicherte Wert liegt ein Haar darunter. sprintf() formatiert diesen gespeicherten Wert und bekommt 2.67, während number_format() und round() ihn als das 2.675 behandeln, das du geschrieben hast. Wenn du eine bestimmte Rundungsregel brauchst, rufst du vorher selbst round(), floor() oder ceil() auf (siehe Runden und Mathe) und übergibst das Ergebnis an number_format().

Geld und andere Währungen formatieren

number_format() weiß nichts über Währungen, also fügst du das Symbol selbst hinzu. Setze Minuszeichen vor das Symbol, und denk daran, dass der Yen keine Nachkommastellen hat:

Für eine Locale-bewusste Ausgabe mit der richtigen Position des Symbols für jedes Land erledigt NumberFormatter aus der Erweiterung intl die ganze Arbeit:

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)

Dafür ist die Erweiterung intl nötig, die nicht überall installiert ist, also ist number_format() mit eigenem Symbol die portable Wahl.

Das Ergebnis ist ein String, keine Zahl

Das ist der häufigste Bug mit number_format(): einen Wert formatieren und dann damit rechnen. "1,234.50" ist kein numerischer String, also liest PHP nur die 1 vor dem Komma:

<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2

Einen solchen String zurück an number_format() zu geben, ist noch schlimmer: Es wirft TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given. Behalte die rohe Zahl zum Rechnen und formatiere erst in dem Moment, in dem du ausgibst. Wenn du einen formatierten String aus einem Formular oder einer Datei bekommst, entfernst du zuerst die Trennzeichen:

Für Auffüllen, Ausrichtung oder ein Pluszeichen vor der Zahl verwendest du stattdessen sprintf(); es fügt keine Tausendertrennzeichen ein, steuert aber Breite und Vorzeichen.

Häufig gestellte Fragen

Wie formatiere ich in PHP eine Zahl mit Tausendertrennzeichen?

Rufe number_format($n) auf: number_format(1234567) liefert "1,234,567". Übergib ein zweites Argument für die Nachkommastellen: number_format(1234567.891, 2) liefert "1,234,567.89".

Wie verwende ich number_format ohne Komma?

Übergib einen leeren String als Tausendertrennzeichen: number_format(1234.5, 2, '.', '') liefert "1234.50". Diese Form erwarten Zahlungs-APIs und CSV-Dateien meistens.

Rundet oder schneidet number_format ab?

Es rundet, Hälften von null weg: number_format(2.5) ist "3", number_format(-2.5) ist "-3" und number_format(2.675, 2) ist "2.68". Um Nachkommastellen stattdessen abzuschneiden, verwendest du vorher floor(): number_format(floor(2.679 * 100) / 100, 2) ergibt "2.67".

Wie formatiere ich Zahlen auf europäische Art (1.234,56)?

Vertausche die Trennzeichen mit dem dritten und vierten Argument: number_format(1234.56, 2, ',', '.') liefert "1.234,56". Französische und Schweizer Schreibweisen verwenden ein Leerzeichen oder einen Apostroph als viertes Argument.

Warum liefert number_format ein falsches Ergebnis, wenn ich damit rechne?

number_format() liefert einen String wie "1,234.50", und PHP liest beim Rechnen nur die 1 vor dem Komma. Behalte die Zahl für Berechnungen und rufe number_format() erst bei der Ausgabe auf.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S