Number.prototype.toLocaleString()
toLocaleString()
方法是 Number
值的一个方法,它返回一个字符串,其中包含此数字的特定于语言的表示形式。在支持 Intl.NumberFormat
API 的实现中,此方法只需调用 Intl.NumberFormat
。
每次调用 toLocaleString
时,它都必须在一个大型的本地化字符串数据库中执行搜索,这可能会降低效率。当使用相同的参数多次调用该方法时,最好创建一个 Intl.NumberFormat
对象并使用其 format()
方法,因为 NumberFormat
对象会记住传递给它的参数,并可能决定缓存数据库的一部分,以便将来调用 format
时可以在更受约束的上下文中搜索本地化字符串。
试一试
语法
toLocaleString()
toLocaleString(locales)
toLocaleString(locales, options)
参数
locales
和 options
参数自定义函数的行为,并允许应用程序指定应使用其格式约定进行格式化的语言。
在支持 Intl.NumberFormat
API 的实现中,这些参数与 Intl.NumberFormat()
构造函数的参数完全对应。不支持 Intl.NumberFormat
的实现被要求忽略这两个参数,使使用的区域设置和返回的字符串形式完全依赖于实现。
locales
可选-
一个包含 BCP 47 语言标记的字符串,或一个包含此类字符串的数组。对应于
Intl.NumberFormat()
构造函数的locales
参数。在不支持
Intl.NumberFormat
的实现中,此参数将被忽略,通常会使用主机的区域设置。 options
可选-
一个调整输出格式的对象。对应于
Intl.NumberFormat()
构造函数的options
参数。在不支持
Intl.NumberFormat
的实现中,此参数将被忽略。
有关这些参数以及如何使用它们的详细信息,请参阅 Intl.NumberFormat()
构造函数。
返回值
根据特定于语言的约定表示给定数字的字符串。
在支持 Intl.NumberFormat
的实现中,这等效于 new Intl.NumberFormat(locales, options).format(number)
。
注意:大多数情况下,toLocaleString()
返回的格式是一致的。但是,输出可能因实现而异,即使在同一区域设置内也是如此——输出变化是设计使然,并且规范允许。它也可能不是你期望的。例如,字符串可能使用不换行空格或被双向控制字符包围。你不应该将 toLocaleString()
的结果与硬编码常量进行比较。
示例
使用 toLocaleString()
此方法的基本用法,不指定 locale
,将在默认区域设置并使用默认选项返回格式化的字符串。
const number = 3500;
console.log(number.toLocaleString()); // "3,500" if in U.S. English locale
检查对 locales 和 options 参数的支持
locales
和 options
参数可能并非所有实现都支持,因为对国际化 API 的支持是可选的,并且某些系统可能没有必要的数据。对于没有国际化支持的实现,toLocaleString()
始终使用系统的区域设置,这可能不是你想要的。因为任何支持 locales
和 options
参数的实现都必须支持 Intl
API,所以你可以检查后者的存在情况以了解支持情况
function toLocaleStringSupportsLocales() {
return (
typeof Intl === "object" &&
!!Intl &&
typeof Intl.NumberFormat === "function"
);
}
使用 locales
此示例显示了本地化数字格式的一些变化。为了获取应用程序用户界面中使用的语言的格式,请确保使用 locales
参数指定该语言(以及可能的一些备用语言)
const number = 123456.789;
// German uses comma as decimal separator and period for thousands
console.log(number.toLocaleString("de-DE"));
// 123.456,789
// Arabic in most Arabic speaking countries uses Eastern Arabic digits
console.log(number.toLocaleString("ar-EG"));
// ١٢٣٤٥٦٫٧٨٩
// India uses thousands/lakh/crore separators
console.log(number.toLocaleString("en-IN"));
// 1,23,456.789
// the nu extension key requests a numbering system, e.g. Chinese decimal
console.log(number.toLocaleString("zh-Hans-CN-u-nu-hanidec"));
// 一二三,四五六.七八九
// when requesting a language that may not be supported, such as
// Balinese, include a fallback language, in this case Indonesian
console.log(number.toLocaleString(["ban", "id"]));
// 123.456,789
使用 options
可以使用 options
参数自定义 toLocaleString()
提供的结果
const number = 123456.789;
// request a currency format
console.log(
number.toLocaleString("de-DE", { style: "currency", currency: "EUR" }),
);
// 123.456,79 €
// the Japanese yen doesn't use a minor unit
console.log(
number.toLocaleString("ja-JP", { style: "currency", currency: "JPY" }),
);
// ¥123,457
// limit to three significant digits
console.log(number.toLocaleString("en-IN", { maximumSignificantDigits: 3 }));
// 1,23,000
// Use the host default language with options for number formatting
const num = 30000.65;
console.log(
num.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}),
);
// "30,000.65" where English is the default language, or
// "30.000,65" where German is the default language, or
// "30 000,65" where French is the default language
规范
规范 |
---|
ECMAScript 语言规范 # sec-number.prototype.tolocalestring |
ECMAScript 国际化 API 规范 # sup-number.prototype.tolocalestring |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。