如何在Javascript中找到当前语言环境的小数点分隔符

Ser*_*gei 2 javascript

在我的应用程序中,有几个地方需要用户输入货币值。该应用程序支持以多种货币以及本地化存储这些货币值。

我正在使用Javascript中的Intl.NumberFormat对象将数字格式化为所需的任何货币和语言环境,但是无法使用它来对数字进行格式化。

到目前为止,我发现的所有库都要求您提供小数和千位分隔符,以便格式化/取消格式化功能起作用。但是,我需要一种方法来首先查找小数和千位分隔符,因此我不能使用它们。

如何可靠地获取当前语言环境的小数点分隔符?

JBE*_*JBE 6

选项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)