Guide to JavaScript Intl.NumberFormat Object
The Intl.NumberFormat object in JavaScript is a built-in
constructor designed for language-sensitive number formatting. It
enables developers to format numbers, currencies, percentages, and units
according to regional and linguistic conventions without writing complex
custom formatting logic. This guide covers how
Intl.NumberFormat works, its primary syntax, and practical
examples for common real-world use cases.
Understanding Intl.NumberFormat
Different regions format numbers differently. For example, the United
States uses commas as thousands separators and periods for decimals
(1,234.56), while Germany uses periods as thousands
separators and commas for decimals (1.234,56).
The Intl.NumberFormat object is part of the ECMAScript
Internationalization API (Intl). It automatically handles
these regional differences by applying appropriate punctuation, currency
symbols, and unit notations based on a specified locale.
Basic Syntax
The basic syntax for creating and using an
Intl.NumberFormat instance is:
const formatter = new Intl.NumberFormat(locales, options);
formatter.format(number);locales(optional): A string or array of strings containing BCP 47 language tags (e.g.,'en-US','de-DE','ja-JP'). If omitted, it defaults to the system’s runtime locale.options(optional): An object configuring the output style, currency, units, digit display, and notation.
Key Use Cases and Examples
1. Standard Number Formatting
Formatting plain numbers according to specific regional conventions:
const number = 1234567.89;
// US English formatting
console.log(new Intl.NumberFormat('en-US').format(number));
// Output: "1,234,567.89"
// German formatting
console.log(new Intl.NumberFormat('de-DE').format(number));
// Output: "1.234.567.89"
// Hindi formatting (uses different grouping systems)
console.log(new Intl.NumberFormat('hi-IN').format(number));
// Output: "12,34,567.89"2. Currency Formatting
To format money, set the style option to
'currency' and define the currency code (ISO
4217 standard):
const amount = 49.99;
// US Dollars formatted for US locale
const formatUSD = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
console.log(formatUSD.format(amount)); // "$49.99"
// Euros formatted for German locale
const formatEUR = new Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR',
});
console.log(formatEUR.format(amount)); // "49,99 €"
// Japanese Yen formatted for Japanese locale
const formatJPY = new Intl.NumberFormat('ja-JP', {
style: 'currency',
currency: 'JPY',
});
console.log(formatJPY.format(5000)); // "¥5,000"3. Percentage Formatting
Setting style: 'percent' converts a decimal fraction
into a standard percentage representation:
const rate = 0.854;
const percentFormatter = new Intl.NumberFormat('en-US', {
style: 'percent',
minimumFractionDigits: 1,
maximumFractionDigits: 1,
});
console.log(percentFormatter.format(rate)); // "85.4%"4. Unit Formatting
The unit style allows formatting numbers alongside
scientific or common measurement units:
const speed = 120;
const speedFormatter = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'kilometer-per-hour',
unitDisplay: 'short', // 'short', 'narrow', or 'long'
});
console.log(speedFormatter.format(speed)); // "120 km/h"5. Compact Notation (Large Numbers)
For dashboards or mobile interfaces with limited space, compact notation shortens large numbers using abbreviations like “K”, “M”, or “B”:
const views = 2540000;
const compactFormatter = new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'short',
});
console.log(compactFormatter.format(views)); // "2.5M"Performance Best Practice
Instantiating an Intl.NumberFormat object can be
computationally expensive. When formatting multiple numbers, create a
single instance and reuse its format method rather than
constructing a new object on each iteration:
// Recommended for lists and loops
const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
const prices = [10.5, 20.0, 99.99];
const formattedPrices = prices.map(price => formatter.format(price));