检测数字格式文化设置

时间:2012-03-16 14:52:26

标签: javascript localization globalization

我有一个需要进行数字输入的网页,这部分很容易使用parseFloat,isNaN和(用于向用户显示值)toFixed的某种组合。问题是Javascript似乎完全不了解文化。有些文化使用小数点逗号而不是小数点,但是Javascript在这里很多。

支持十进制逗号不是太麻烦,我可以在解析用户输入之前用小数点替换一个逗号,我可以在向用户显示结果之前反过来。我的问题是,有没有办法让Javascript 知道用户文化设置?我只关心小数点分隔符,所以现在我对千位分隔符或货币等其他复杂功能没兴趣。

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

更新

如果有其他人想要它(或者如果有人可以看到一个缺陷 - 除了没有在Chrome中工作,如上所述 - 或更好的方式),我最终做到了这一点:

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

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

,则现在useComma将为true

3 个答案:

答案 0 :(得分:3)

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

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

如果您认为它可以提供更好的用户体验,那么您可以使用后备技术并尝试最期望的格式。

答案 1 :(得分:2)

怎么样

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

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

答案 2 :(得分:0)

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,
    }
}
//