如何根据用户区域设置数字和日期的格式

How to format numbers and dates based on user locale settings?

本文关键字:数字 日期 格式 设置 区域 何根 用户 用户区      更新时间:2023-09-26

我需要一种方法来根据用户的区域设置自动格式化日期和数字对象。

到目前为止,我一直在使用toLocaleString()日期函数。对于数字,也可以使用toLocaleString(),但正如您在我准备的 jsFiddle 中看到的那样,浏览器之间的结果差异很大。在我的 Windows 机器上使用英语(美国)语言环境,我得到这个:

  • IE9:15,000.00
  • 火狐浏览器:15,000
  • 铬:15000

在 Chrome 中,似乎toLocaleString()对数字根本不起作用。除了这种方法,我还尝试过:

  • 要使用 MicrosoftAjax.js库localeFormat()函数,但无论我在 PC 上设置了哪个区域设置(通过使用"区域和语言"对话框),日期和数字仍然都以美国格式格式化。
  • 使用像全球化这样的库。尽管它们确实提供了格式设置功能,但它们无法自动检测用户的区域设置。

因此,总结一下:如何自动格式化数字和日期以尊重以适用于所有主要浏览器(IE,Firefox,Chrome)的方式浏览网页的用户的区域设置?

原生

Javascript对象上的.toLocaleString()函数实际上是无用的,因为它不允许你指定语言环境或以其他方式控制它们的行为。

在 ECMAScript i18n API 成为现实之前(这可能太遥远了,现在根本不值得考虑),你唯一可行的选择是使用 Globalize 等库,但正如你所说,你需要检测用户的首选语言环境。

检测语言环境是另一个用纯Javascript不容易解决的问题。具体来说,恕我直言,Accept-Language标头作为区域设置检测的手段实际上是无用的,因为它对绝大多数 Web 用户不可见。这就是为什么 Web 应用程序通常为用户提供一种自定义机制来选择将通信回服务器的区域设置,并且服务器使用此信息来配置此后的每个响应。

今天,@Jon提到的国际化API得到了广泛的支持。您可以使用Number(123456).toLocaleString()的基元数字,Chrome 现在会按预期返回"123,456"(对于美国语言环境)。我还没有在IE11/Edge上进行测试,但根据caniuse的支持。