如何根据用户语言环境设置格式化数字和日期?

7
我需要一种根据用户的语言环境自动格式化日期和数字对象的方法。
目前,我已经使用toLocaleString()函数进行日期格式化。对于数字,toLocaleString()也是可用的,但正如我在准备好的jsFiddle中所看到的,结果在不同浏览器中有很大的差异。
在我的Windows机器上使用英语(美国)语言环境时,IE9返回15,000.00,Firefox返回15,000,Chrome返回15000。
在Chrome中,看起来toLocaleString()根本不适用于数字。除了这种方法,我还尝试过:
1、使用MicrosoftAjax.js库localeFormat()函数,但无论我在我的PC上设置了哪个区域设置(通过使用“区域和语言”对话框),日期和数字仍然都以美国格式进行格式化。
2、使用像Globalize这样的库。虽然他们提供了格式化能力,但它们不能自动检测用户的语言环境。
因此,总结一下:如何自动格式化数字和日期,以便尊重用户浏览网页时的地区设置,并且能够在主要浏览器(IE、Firefox、Chrome)中正常工作?

在服务器端,您可以从浏览器发送的Accept-Language中检测区域设置。使用该信息,您的服务器可以根据区域设置发送JavaScript。编辑:似乎您还可以从navigator.language获取它,但是如果某个库无法使用它,则我不知道它有多受支持。 - Esailija
使用 Accept-Language 是错误的且完全无用的。例如,我的系统设置为使用英语(因为翻译后的操作系统是无法使用的),但我使用挪威或 ISO 日期格式(因为英国和美国的日期格式不实用,而我不在英国或美国)。我认为这不是一个边缘案例,而是代表了世界各地广泛用户的情况。 - Florian Winter
2个回答

10

.toLocaleString()函数作用于Javascript本地对象几乎没有用处,因为它不允许您指定区域设置或者以其他方式控制其行为。

ECMAScript i18n API成为现实之前(这可能太遥远了,现在并不值得考虑),你唯一的实际选择是使用像Globalize这样的库,但这就需要检测用户的首选语言环境。

检测语言环境是另一个问题,用纯Javascript很难解决。具体来说,我认为Accept-Language头作为一种语言环境检测手段几乎没有用处,因为对于绝大多数网络用户而言,这个头部信息是不可见的。这就是为什么Web应用程序通常提供自定义机制让用户选择语言环境,然后将此信息传回服务器,服务器使用此信息配置每个响应。


感谢您详尽的回答。我可能会让用户选择他喜欢的语言环境,不会尝试任何花哨的东西。 - Nikola Anusev

2

今天Jon提到的国际化API得到了广泛支持。 从一个原始数字,你可以使用Number(123456).toLocaleString(),Chrome现在返回"123,456",如预期一样(对于美国地区)。我没有在IE11/Edge上测试过,但根据caniuse,支持是存在的。


1
抱歉,但在我看来这个还是不行。我已将系统设置为en-US,但日期格式为yyyy-MM-dd,但toLocaleDateString()仍输出MM/dd/YYYY。 - Rahly
仍然在2019年无法正常工作(在Windows上的Firefox和Chrome浏览器中)。 - Florian Winter
@Rahly 我认为它只考虑了本地设置,所以它做了它应该做的事情。你在系统上覆盖了特定的本地设置并不应该被这个API所覆盖。 - Greg
@Greg,这就是Locale的重点。Locale被定义为:“在计算机中,Locale是定义用户语言、地区和任何特殊变体偏好的一组参数,用户希望在其用户界面中看到这些变体偏好。”应考虑系统覆盖。 - Rahly
@Rahly 我应该说:它取决于所支持的区域设置粒度。 - Greg
@Greg 如果我无法得到用户想要看到的格式,那么这就是实现区域设置失败,如果系统不被接受,那么浏览器应该允许我更改它。 - Rahly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接