toLocaleString 不适用于所有浏览器中小于 10000 的数字
Posted
技术标签:
【中文标题】toLocaleString 不适用于所有浏览器中小于 10000 的数字【英文标题】:toLocaleString not working on numbers less than 10000 in all browsers 【发布时间】:2019-08-23 14:12:37 【问题描述】:我正在开发一个根据用户配置显示数字的应用程序。一切都按预期工作,除非我在 Chrome 中尝试使用小于 10000 的数字,使用以下语言环境:“es-AR”。有什么想法吗?
铬:
火狐:
边缘:
console.log( (10000).toLocaleString("es-AR") );
console.log( (9999).toLocaleString("es-AR") );
console.log( (9999).toLocaleString("en-US") );
【问题讨论】:
【参考方案1】:根据最新的 CLDR 数据,这是西班牙语言环境的预期行为。具体来说,“最小分组位数”设置为2 according to the CLDR survey tool。
这意味着the grouping separator is only used when there would be 2 or more digits before it。
显然 Firefox 和 Edge 要么使用该数据的旧版本,要么尚不支持该字段。
该功能是在 in CLDR 26, which was released in 2014 引入的,但像这样的增强功能需要很长时间才能通过软件堆栈。
【讨论】:
这解释了这个错误(以典型的“这是设计使然”的借口),但是有内置的解决方法吗?还是应该重写数字格式化函数来修复千位分隔符的位置? @Alejandro:本地化支持变得更好是一个特性。如果您坚持认为这是一个错误,那么也许您应该切换到 C 和itoa
系列方法。
这不是更好的行为。虽然这实现了一些“规范”,但这反过来又不反映现实生活。作为一个以西班牙语为母语的人,我知道没有任何西班牙语变体可以认为这种表示法是正确的。事实上,我只是因为我编写的一段代码使用了它才意识到这种奇怪的行为,当 QA 回复我说“它工作正常,但让我们让千位分隔符统一,现在它适用于某些价值观,而不是其他人”。我坚持认为这是一个错误,如果不是在实现中,在规范中,因为它与现实生活不符。【参考方案2】:
根据 CLDR,西班牙西班牙语的最小分组数字确实是两个。
完整的语言规范可以在GitHub找到。
有趣的是,始终使用至少两个分组数字与 RAE 规则相冲突。他们指出,此建议并不适用于所有情况,将会计和任何可能涉及安全风险的情况列为特定例外情况。
【讨论】:
RAE 规则的任何来源? @Madacol。 RAE 来源:lema.rae.es/dpd/srv/search?id=PxrAnmVfND6FK0uGdT " Esta recomendación no debe aplicarse en documentos contables ni en ningún tipo de escrito en que la separación arriesgue la seguridad。" Para facilitar la lectura de estos números, cuando constan de más de cuatro cifras se recomienda separar estas mediante espacios por grupos de tres, contando de derecha a izquierda: 52 345, 6 462 749。 据我了解,RAE 建议使用空格而不是点作为组分隔符【参考方案3】:鉴于规范强制执行此行为,并且现实生活中的经验是这有时会被报告为需要修复的错误,这里是原始发布者要求的简单解决方法。它就像检测四个整数数字并手动添加千位分隔符一样脏(并且可以通过许多更好的方式完成)。
var decimals=2;
value=value.toLocaleString('es', minimumFractionDigits: decimals, maximumFractionDigits: decimals);
//fix spanish thousands separator for <10.000
if(value.indexOf(',')==4 || (decimals==0 && value.length==4))
value=value.substr(0,1)+'.'+value.substr(1);
【讨论】:
以上是关于toLocaleString 不适用于所有浏览器中小于 10000 的数字的主要内容,如果未能解决你的问题,请参考以下文章
并非所有浏览器都支持 toLocaleString()? [复制]
并非所有浏览器都支持 toLocaleString()? [复制]