How to format numbers with commas in JavaScript

Updated Feb 17, 2024#javascript#numbers

The usage of commas (,) and periods (.) as decimal separators and thousands separators varies based on the conventions of different regions and countries. These conventions can sometimes be the opposite of what you might expect, depending on your cultural context.

  • In many English-speaking countries, such as US/UK, the period is used as the decimal separator (eg: 3.14), the comma is used as the thousands separator (eg: 1,000,000).
  • In some countries, including many European countries, the comma is used as the decimal separator (eg: 3,14), the period is used as the thousands separator (eg: 1.000.000).

It’s important to note that these conventions can vary widely. For instance, some countries may use spaces or apostrophes as thousands separators, and others may use a combination of characters. It’s a good practice to use localization libraries or functions that can automatically format numbers according to the user’s locale.

This article focuses on the most popular number formatting conventions:

  • Use comma (,) as the thousands separator
  • Use period (.) as the decimal separator

For example: 1,234,567.89

There are different ways to format numbers with commas and decimal places in JavaScript, depending on your needs and preferences.

Using toLocaleString method

The Number.prototype.toLocaleString() method is used to format a number into a string representation according to the specified locale and formatting options. This method provides a way to automatically format numbers based on the user’s locale, including adding commas for thousands separation and specifying decimal points.

const number = 1234567.89;

// Using default formatting (based on user's locale)
const formattedNumberDefault = number.toLocaleString();
console.log(formattedNumberDefault); // Output depends on user's locale

// Specifying a specific locale (e.g., en-US)
const formattedNumberUS = number.toLocaleString('en-US');
console.log(formattedNumberUS); // Output: "1,234,567.89"

// Specifying options for formatting
const options = {
  style: 'decimal',  // Other options: 'currency', 'percent', etc.
  minimumFractionDigits: 2,
  maximumFractionDigits: 2,
};
const formattedWithOptions = number.toLocaleString('en-US', options);
console.log(formattedWithOptions); // Output: "1,234,567.89"

This method also handles scientific notation numbers, commonly known as exponential notation, which are represented using the format x * 10^y, where x is a coefficient and y is the exponent.

const scientificNumber = 1.234e6; // 1.234 * 10^6 = 1234000

// Using default formatting (based on user's locale)
const formattedScientificDefault = scientificNumber.toLocaleString();
console.log(formattedScientificDefault); // Output depends on user's locale

// Specifying a specific locale (e.g., en-US)
const formattedScientificUS = scientificNumber.toLocaleString('en-US');
console.log(formattedScientificUS); // Output: "1,234,000"

Using Intl.NumberFormat

Intl.NumberFormat is part of the Internationalization API, which allows you to create applications that can be easily adapted to different languages, regions, and cultures.

This is a constructor function that creates a new instance of a number formatter object. You can pass one or more locales and an options object to customize the formatting. You can then use the format method or the format property of the instance to format any number.

// Create an Intl.NumberFormat formatter with desired options
const numberFormatter = new Intl.NumberFormat('en-US', {
  style: 'decimal',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});

// Numbers to be formatted
const numbersToFormat = [12345.6789, 9876.54321, 456.789];

// Format and display each number using the formatter
numbersToFormat.forEach(number => {
  const formattedNumber = numberFormatter.format(number);
  console.log(formattedNumber);
});

// Output:
// 12,345.68
// 9,876.54
// 456.79

It’s more efficient when formatting large numbers of numbers, because it creates a reusable formatter object that can be applied to multiple numbers.

In most cases, if you need advanced control over number formatting, especially when dealing with multiple locales or specific formatting requirements, Intl.NumberFormat is the recommended choice. If you just want to format numbers according to the user’s locale settings in a simpler manner, Number.prototype.toLocaleString() might suffice.

Here’s an example formatting with multiple locales:

// List of numbers to format
const numbersToFormat = [1234567.89, 98765.4321, 1234.5678];

// List of locales representing different countries
const locales = ['en-US', 'fr-FR', 'de-DE', 'es-ES', 'ja-JP'];

// Iterate through each locale and format numbers
locales.forEach(locale => {
  // Create a formatter with the current locale
  const formatter = new Intl.NumberFormat(locale);

  // Format and display each number for the current locale
  const formattedNumbers = numbersToFormat.map(number => formatter.format(number));

  // Display the formatted numbers with comments
  console.log(`Locale: ${locale}`);
  formattedNumbers.forEach((formattedNumber, index) => {
    console.log(`Number ${index + 1}: ${formattedNumber}`);
  });
  console.log('\n'); // Add a newline for separation
});

This code will output the formatted numbers in different locales:

Locale: en-US
Number 1: 1,234,567.89
Number 2: 98,765.432
Number 3: 1,234.568


Locale: fr-FR
Number 1: 1 234 567,89
Number 2: 98 765,432
Number 3: 1 234,568


Locale: de-DE
Number 1: 1.234.567,89
Number 2: 98.765,432
Number 3: 1.234,568


Locale: es-ES
Number 1: 1.234.567,89
Number 2: 98.765,432
Number 3: 1234,568


Locale: ja-JP
Number 1: 1,234,567.89
Number 2: 98,765.432
Number 3: 1,234.568