NumberFormat

new Intl.NumberFormat(locales, options) formats numbers and BigInts. The style option picks decimal (default), currency (with currency), percent or unit (with unit). Other options set notation (compact, scientific, engineering), signDisplay, useGrouping, currencyDisplay (symbol, code, name) and rounding through minimumFractionDigits, maximumFractionDigits or significant digits. formatToParts() returns typed pieces for custom styling, and formatRange(3, 5) prints a range such as "€3.00 – €5.00".

One number in five locales, three currencies, and compact, unit and percent stylesJavaScriptLive
const n = 1234567.891;
for (const locale of ['en-US', 'de-DE', 'en-IN', 'ar-EG', 'zh-CN-u-nu-hanidec']) {
  console.log(locale.padEnd(19), new Intl.NumberFormat(locale).format(n));
}
const money = (l, c) => new Intl.NumberFormat(l, { style: 'currency', currency: c }).format(n);
console.log(money('en-US', 'USD'), '|', money('de-DE', 'EUR'), '|', money('ja-JP', 'JPY'));
console.log(new Intl.NumberFormat('en', { notation: 'compact' }).format(n),
  new Intl.NumberFormat('ja', { notation: 'compact' }).format(n),
  new Intl.NumberFormat('en', { style: 'unit', unit: 'kilometer-per-hour' }).format(88),
  new Intl.NumberFormat('en', { style: 'percent', signDisplay: 'always' }).format(0.256));

Plain numbers keep up to three fraction digits; currencies round to their minor unit, which for the yen is none. Indian English groups by lakh and crore. Store and transmit raw numbers and never parse formatted text back.