在我的应用程序中,有几个地方需要用户输入货币值。该应用程序支持以多种货币以及本地化存储这些货币值。
我正在使用Javascript中的Intl.NumberFormat对象将数字格式化为所需的任何货币和语言环境,但是无法使用它来对数字进行格式化。
到目前为止,我发现的所有库都要求您提供小数和千位分隔符,以便格式化/取消格式化功能起作用。但是,我需要一种方法来首先查找小数和千位分隔符,因此我不能使用它们。
如何可靠地获取当前语言环境的小数点分隔符?
选项1:使用Intl.NumberFormat#formatToParts
最可靠的方法,仅适用于支持Intl API的浏览器。否则,它需要一个Intl polyfill
function getDecimalSeparator(locale) {
const numberWithDecimalSeparator = 1.1;
return Intl.NumberFormat(locale)
.formatToParts(numberWithDecimalSeparator)
.find(part => part.type === 'decimal')
.value;
}
Run Code Online (Sandbox Code Playgroud)
选项2:使用toLocaleString
不太优雅,它取决于一个分隔符总是一个字符长的事实,所有语言似乎都是这样:小数分隔符-Wikipedia
function getDecimalSeparator(locale) {
const numberWithDecimalSeparator = 1.1;
return numberWithDecimalSeparator
.toLocaleString(locale)
.substring(1, 2);
}
Run Code Online (Sandbox Code Playgroud)
此处已建议这样做:使用浏览器,我如何知道客户端使用的是哪个小数点分隔符?
例子:
> getDecimalSeparator()
"."
> getDecimalSeparator('fr-FR')
","
Run Code Online (Sandbox Code Playgroud)
选项1的奖金:
我们可以扩展它以检索给定语言环境的小数或组分隔符:
function getSeparator(locale, separatorType) {
const numberWithGroupAndDecimalSeparator = 1000.1;
return Intl.NumberFormat(locale)
.formatToParts(numberWithGroupAndDecimalSeparator)
.find(part => part.type === separatorType)
.value;
}
Run Code Online (Sandbox Code Playgroud)
例子:
> getSeparator('en-US', 'decimal')
"."
> getSeparator('en-US', 'group')
","
> getSeparator('fr-FR', 'decimal')
","
> getSeparator('fr-FR', 'group')
" "
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |