【问题标题】:How do I find the decimal separator for current locale in Javascript如何在 Javascript 中找到当前语言环境的小数点分隔符
【发布时间】:2016-01-14 13:11:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这里有一个nice library 可以做到这一点。
  • 我已经改写了这个问题,以减少基于意见的程度,并希望能更清楚地了解我正在努力实现的目标。 accounting.js 库确实不错,但它仍然需要我知道 locale 的分隔符是什么,我不知道该怎么做。

标签: javascript


【解决方案1】:

选项 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 的奖励:

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

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')
" "

【讨论】:

  • 这段代码几乎对我有用,但如果我使用示例中的数字 1000.1,它将找不到组分隔符。当我使用 10000.1 时,它起作用了。
猜你喜欢
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多