The Object toLocaleString() method

By

Learn how the JavaScript toLocaleString() method returns a string representation of an object and accepts an optional locale argument to customize it.

~~~

The toLocaleString() method returns a string representation of an object, meant to be adapted to a locale, meaning a language and region.

Called on a plain object instance, it returns the [object Object] string, unless overridden:

const person = { name: 'Fred' }
person.toLocaleString() //[object Object]

That’s because the version defined on Object.prototype does nothing locale-related. It just calls toString(). So why does it exist at all?

Why does this method exist?

It’s a hook. JavaScript defines it on Object.prototype so that every object has it, and the types where locale formatting makes sense override it with a useful implementation.

Numbers, dates, and arrays all do. That’s where this method gets interesting:

const price = 1234567.89

price.toLocaleString('en-US') //1,234,567.89
price.toLocaleString('it-IT') //1.234.567,89

Same number, different separators. English uses commas for thousands and a dot for decimals. Italian does the opposite.

Dates get the same treatment:

const date = new Date(2026, 7, 7)

date.toLocaleString('it-IT') //07/08/2026, 00:00:00

An array calls toLocaleString() on each of its elements and joins the results with commas. Handy when a list mixes numbers and dates and you want them all localized in one call.

Number’s version also accepts an options object as second argument, for things like currency formatting:

const price = 42

price.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })
//42,00 €

Objects can override it too

Since it’s just a method, your own objects can return a different string representation depending on the locale:

const temperature = {
  celsius: 20,
  toLocaleString(locale) {
    if (locale === 'en-US') {
      return `${this.celsius * 1.8 + 32}°F`
    }
    return `${this.celsius}°C`
  }
}

temperature.toLocaleString('en-US') //68°F
temperature.toLocaleString('it-IT') //20°C

Code that formats values for display can now call toLocaleString() on anything, without knowing the type, and get something sensible back.

One pitfall

On a plain object, the locale argument is silently ignored:

const person = { name: 'Fred' }
person.toLocaleString('it-IT') //[object Object]

No error, no warning, just the useless default. If you’re passing a locale and getting [object Object] back, you’re calling the base implementation. Either format the individual number and date properties instead, or override the method as shown above.

~~~

Related posts about js: