检测数字格式文化设置

Posted

技术标签:

【中文标题】检测数字格式文化设置【英文标题】:Detecting number format culture settings 【发布时间】:2012-04-02 03:04:59 【问题描述】:

我有一个需要输入数字的网页,这部分很容易结合使用 parseFloat、isNaN 和(用于将值显示给用户)toFixed。问题是 javascript 似乎完全不了解这里的文化。一些文化使用小数点逗号而不是小数点,但 Javascript 在这方面占优势。

支持小数点逗号并不太麻烦,我可以在解析用户输入之前将逗号替换为小数点,然后我可以在将结果显示给用户之前执行相反的操作。我的问题是,Javascript 有没有办法了解用户的文化设置?我只关心小数点分隔符,所以现在我对千位分隔符或货币等其他复杂问题不感兴趣。

是否有可靠的(客户端)方法来检测访问者是否使用小数点逗号而不是小数点?

更新

如果其他人想要它(或者如果任何人都可以看到缺陷 - 除了不能在 Chrome 中工作,如前所述 - 或更好的方法),我最终这样做了:

var useComma = (0.1).toLocaleString().indexOf(",") > 0;

如果用户将逗号设置为小数点分隔符,则 useComma 将为真

【问题讨论】:

JS 没有原生数字格式化功能,也没有原生 I18N 功能。 可能有一个不错的 i18n(“国际化”)库可供您使用。 Globalization 看起来不错,但我从未使用过。 @Cory:是的,我只是在浏览那个库,但据我所知,它没有检测到文化(除非我在某处遗漏了那部分)而且似乎有点我需要做的这件事很沉重。 【参考方案1】:

我认为尝试检测用户的语言环境实际上可能没有太大帮助。如果您的 Web 应用程序是英文的,那么用户实际上可能会使用英文风格的格式(例如 1.3),即使在他们自己的文化中它的格式会有所不同(1,3 用于 fr-FR 或 es-ES)!谁会责备他们?

您可以尝试并聪明地使用 Alex K 提出的解决方案,和/或考虑 accept-language 标头、与您的本地化匹配的语言环境(如果有)甚至 GeoIP 以获得最佳猜测。但是为了减少混淆,您可能希望在您希望用户输入数字或日期或其他区域设置敏感数据时给他们提示......在字段旁边显示默认值或示例,使用与您相同的区域设置进行格式化将用于解析用户输入。

如果您认为灵活的方式可以为您提供更好的用户体验,您可以使用后备技术并尝试您最期待的格式。

【讨论】:

【参考方案2】:

怎么样

var decimalChar = (0.1).toLocaleString().charAt(1);

编辑,这似乎不适用于 chrome Internationalization(Number formatting "num.toLocaleString()") not working for chrome

【讨论】:

似乎适用于 IE8 和 FF 11,它涵盖了我的大多数用户。谢谢。我以为 toLocaleString 只用于日期! 一些测试人员可以使用##(多个字符)作为小数分隔符;o)【参考方案3】:
function browser_i18n() 
    var o1 = new Intl.NumberFormat().resolvedOptions();
    var o2 = new Intl.DateTimeFormat().resolvedOptions();
    var o3 = new Intl.NumberFormat().formatToParts( 123456.789 );
    return 
        locale: o1.locale,
        sign: o1.signDisplay,
        group: o1.useGrouping,
        timeZone: o2.timeZone,
        calendar: o2.calendar,
        thousands: o3[ 1 ].value,
        decimals: o3[ 3 ].value,
    

//

【讨论】:

以上是关于检测数字格式文化设置的主要内容,如果未能解决你的问题,请参考以下文章

检测 VB.Net 中数字的文化,即小数点/千位分隔符的句点或逗号

asp.net mvc 设置数字格式默认十进制千位分隔符

C# 为班级设置特定的文化

DateTimePicker 设置日历和时间文化

为 Windows 窗体应用程序设置文化信息

将线程文化设置为中性文化