Start · Sprachen · JavaScript · Referenz · new Intl.NumberFormat()

new Intl.NumberFormat()

Methode

Erzeugt ein <code>Intl.NumberFormat</code>-Objekt, das Zahlen je nach Sprache und Region formatiert, etwa als Währung, Prozentwert, Einheit oder in Kurzschreibweise.

seit JavaScript ES Internationalization API 1.0 (ECMA-402, 2012); Kategorie: method-property

Signatur

new Intl.NumberFormat(locales, options)

Beschreibung

Der Konstruktor Intl.NumberFormat() liefert einen wiederverwendbaren Formatierer für Zahlen. Er berücksichtigt die Regeln der gewählten Sprache und Region: Dezimal- und Tausendertrennzeichen, die Position des Währungssymbols, Ziffernsysteme (z. B. arabisch-indische Ziffern) und Rundungsregeln. Formatiert wird über die Methode format(). Mit formatToParts() erhält man die Einzelteile als Array, formatRange() formatiert Wertebereiche.

Man nutzt den Konstruktor immer dann, wenn Zahlen für Menschen angezeigt werden: Preise im Onlineshop, Statistiken in Dashboards, Dateigrößen, Prozentwerte oder kompakte Angaben wie „1,2 Mio.“. Über options steuert man den Stil (style: "decimal", "currency", "percent", "unit"), die Schreibweise (notation: "standard", "scientific", "engineering", "compact") und die Nachkommastellen.

Der Aufruf mit oder ohne new liefert dasselbe Ergebnis. Das Erzeugen eines Formatierers kostet vergleichsweise viel Rechenzeit. Wer viele Zahlen formatiert, legt deshalb eine Instanz an und verwendet sie weiter, statt bei jedem Aufruf Number.prototype.toLocaleString() mit Optionen aufzurufen.

Parameter

Name Typ Default Beschreibung
$locales string | string[] | Intl.Locale | undefined undefined (Standard-Locale der Laufzeitumgebung) Ein BCP-47-Sprach-Tag wie "de-DE" oder ein Array davon, sortiert nach Priorität. Unicode-Erweiterungen wie "-u-nu-arab" (Ziffernsystem) sind möglich. Wird keine passende Locale gefunden, greift eine Ausweich-Locale.
$options object {} Konfigurationsobjekt. Wichtige Schlüssel:
  • style: "decimal" (Standard), "currency", "percent" oder "unit"
  • currency: ISO-4217-Code, z. B. "EUR" (Pflicht bei style: "currency")
  • currencyDisplay: "symbol", "narrowSymbol", "code" oder "name"
  • currencySign: "standard" oder "accounting"
  • unit / unitDisplay: Einheit, z. B. "kilometer-per-hour", angezeigt als "short", "long" oder "narrow"
  • notation: "standard", "scientific", "engineering" oder "compact"; dazu compactDisplay: "short" oder "long"
  • minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, minimumSignificantDigits, maximumSignificantDigits
  • roundingMode, roundingPriority, roundingIncrement, trailingZeroDisplay (ES2023)
  • useGrouping: true, false, "always", "auto" oder "min2"
  • signDisplay: "auto", "always", "exceptZero", "negative" oder "never"
  • numberingSystem, localeMatcher

Rückgabewert

Typ
Intl.NumberFormat
Beschreibung
Eine neue Intl.NumberFormat-Instanz mit den Methoden format(), formatToParts(), formatRange(), formatRangeToParts() und resolvedOptions().

Beispiele

Preise im Onlineshop als Euro formatieren

const euro = new Intl.NumberFormat('de-DE', {
  style: 'currency',
  currency: 'EUR'
});

const warenkorb = [19.9, 4.5, 1234.567];
warenkorb.forEach((preis) => console.log(euro.format(preis)));

// Gleicher Betrag, andere Region
const usd = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
console.log(usd.format(1234.567));
19,90 € 4,50 € 1.234,57 € $1,234.57

Kompakte Schreibweise und Prozentwerte im Dashboard

const kompakt = new Intl.NumberFormat('de-DE', {
  notation: 'compact',
  compactDisplay: 'short',
  maximumFractionDigits: 1
});
console.log(kompakt.format(1250));
console.log(kompakt.format(3_400_000));

const prozent = new Intl.NumberFormat('de-DE', {
  style: 'percent',
  signDisplay: 'exceptZero',
  maximumFractionDigits: 1
});
console.log(prozent.format(0.1234));
console.log(prozent.format(-0.05));
1250 3,4 Mio. +12,3 % -5 %

Einheiten und Einzelteile mit formatToParts()

const tempo = new Intl.NumberFormat('de-DE', {
  style: 'unit',
  unit: 'kilometer-per-hour',
  unitDisplay: 'long'
});
console.log(tempo.format(120));

const zahl = new Intl.NumberFormat('de-DE', { minimumFractionDigits: 2 });
const teile = zahl.formatToParts(9876.5);
console.log(teile.map(({ type, value }) => `${type}:${value}`).join(' | '));

console.log(zahl.resolvedOptions().locale);
120 Kilometer pro Stunde integer:9 | group:. | integer:876 | decimal:, | fraction:50 de-DE

// Wichtig · Fallstricke

  • Ausgabe nicht fest vergleichen: Die Ergebnisse hängen von der ICU-/CLDR-Version der Laufzeitumgebung ab. Oft stehen geschützte Leerzeichen darin (U+00A0, U+202F) statt normaler Leerzeichen, z. B. vor „€“. Tests mit === gegen fest eingetragene Zeichenketten schlagen daher leicht fehl.
  • Kompakte Schreibweise: Im Deutschen wird „Tsd.“ standardmäßig nicht verwendet. 1250 bleibt deshalb bei compactDisplay: \"short\" als „1250“ stehen.
  • Bei style: \"currency\" ohne currency wirft der Konstruktor einen TypeError. Ungültige Sprach-Tags oder Optionswerte führen zu einem RangeError.
  • Standardmäßig werden bei Währungen die Nachkommastellen der jeweiligen Währung verwendet (EUR: 2, JPY: 0). Mit minimumFractionDigits und maximumFractionDigits lässt sich das ändern. Der Standard für roundingMode ist \"halfExpand\" (kaufmännisches Runden).
  • Große Werte können als BigInt oder als Dezimal-Zeichenkette (ES2023) übergeben werden. So bleibt die volle Genauigkeit erhalten, ohne die Ungenauigkeiten von Gleitkommazahlen.
  • Kompatibilität: Die Grundfunktionen laufen in allen Browsern. notation, unit und signDisplay gibt es seit ES2020 (Chrome 77, Firefox 78, Safari 14.1). roundingMode, formatRange() und trailingZeroDisplay kamen mit ES2023. Node.js vor Version 13 enthält standardmäßig nur englische Sprachdaten (small-icu).
  • Performance: Eine Instanz sollte wiederverwendet und nicht in Schleifen oder bei jedem Rendern neu erzeugt werden.