如何在Javascript中找到当前区域设置的小数分隔符

时间:2015-10-15 22:09:28

标签: javascript

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

我正在使用Javascript中的Intl.NumberFormat对象将数字格式化为我需要的任何货币和区域设置,但是无法使用该格式取消格式化数字。

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

如何可靠地获取当前区域设置的小数分隔符?

1 个答案:

答案 0 :(得分:4)

选项1:使用Intl.NumberFormat#formatToParts

最可靠的方法,仅适用于browsers supporting the Intl API。否则,它需要一个Intl polyfill

function getDecimalSeparator(locale) {
    const numberWithDecimalSeparator = 1.1;
    return Intl.NumberFormat(locale)
        .formatToParts(numberWithDecimalSeparator)
        .find(part => part.type === 'decimal')
        .value;
}

选项2:使用toLocaleString

不太优雅,它依赖于这样一个事实,即分隔符总是一个字符长,所有语言似乎都是这样:Decimal separator - Wikipedia

function getDecimalSeparator(locale) {
    const numberWithDecimalSeparator = 1.1;

    return numberWithDecimalSeparator
        .toLocaleString(locale)
        .substring(1, 2);
}

在这里建议这样做:With a browser, how do I know which decimal separator that the client is using?

示例:

> getDecimalSeparator()
"."
> getDecimalSeparator('fr-FR')
","

选项1的奖励:

我们可以扩展它以检索给定语言环境的十进制分隔符:

function getSeparator(locale, separatorType) {
        const numberWithGroupAndDecimalSeparator = 1000.1;
        return Intl.NumberFormat(locale)
            .formatToParts(numberWithGroupAndDecimalSeparator)
            .find(part => part.type === separatorType)
            .value;
    }

示例:

> getSeparator('en-US', 'decimal')
"."
> getSeparator('en-US', 'group')
","
> getSeparator('fr-FR', 'decimal')
","
> getSeparator('fr-FR', 'group')
" "