Intl.NumberFormat 中的多个语言环境?

Posted

技术标签:

【中文标题】Intl.NumberFormat 中的多个语言环境?【英文标题】:Multiple locales in Intl.NumberFormat? 【发布时间】:2018-02-04 14:43:33 【问题描述】:

我必须处理三种不同的货币:USD、UAH 和 EUR。要使用Intl.NumberFormat 正确显示它们中的每一个,我必须为每个使用不同的语言环境:

const _ =  style: "currency" ;

// notice different locales
new Intl.NumberFormat("en",  ..._, currency: "USD" ).format(15); // $15.00
new Intl.NumberFormat("uk",  ..._, currency: "UAH" ).format(15); // 15,00 грн.
new Intl.NumberFormat("de",  ..._, currency: "EUR" ).format(15); // 15,00 €

所以为了让这个工作我必须为每种货币带来不同的语言环境:

const currency = 
    code: "USD", // "USD" | "UAH" | "EUR"
    rate: 1, // arbitrary
    locale: "en", // "en" | "uk" | "de"


new Intl.NumberFormat(currency.locale,  ..._, currency: currency.code ).format(15);

我觉得这种方法不优雅:模型应该对视图一无所知。 但是还有更好的吗?

也许可以使用多种语言环境,像这样:

const LOCALES = ["en", "uk", "de"];

// ...

new Intl.NumberFormat(LOCALES,  ..._, currency: currency.code ).format(15);

【问题讨论】:

【参考方案1】:

我有点怀疑是否真的需要这样做(多个语言环境)。

想想会看到这个的用户。

他们习惯于在一个语言环境中查看事物,并且可能不知道某种货币的“语言环境约定”是什么。

但问题是,货币并不能决定格式。 如果我是美国人,那么我预计会看到 12,345.67 美元、12,345.67 欧元和 12,345.67 日元 我不熟悉欧洲或日本的公约。

所以我认为您应该对所有格式使用相同的语言环境(当前用户语言环境)。 哎呀,我什至可能不知道“грн”是什么,我宁愿期待“12,345.67 乌克兰格里夫纳”或“UAH 12,345.67”之类的东西,就像大多数货币兑换亭一样。所以这取决于用例。

但是,如果您确定希望格式遵循货币,而不是用户自定义,那么使用不同的格式化程序是唯一的方法。 你想要的不是一个常见的用例,所以没有 API 来支持它。

【讨论】:

现在我明白了,我误解了语言环境的真正含义。谢谢!

以上是关于Intl.NumberFormat 中的多个语言环境?的主要内容,如果未能解决你的问题,请参考以下文章

使用不带货币符号的 Intl.NumberFormat 进行货币格式化

Intl.NumberFormat.formatToParts 不是函数

Intl.NumberFormat#format 最大整数值

如何将 Intl.NumberFormat 与本机反应一起使用?

Intl.NumberFormat 没有做数百万正确

Intl.NumberFormat 返回数字和货币符号通过间距划分的结果