我必须处理三种不同的货币:美元,UAH和欧元。为了使用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);

最佳答案

我有点怀疑是否真的需要这样做(多个区域设置)。

考虑一下将看到此内容的用户。

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

但事实是,货币不能决定格式。
如果我是美国人,那么我希望能看到$ 12,345.67和€12,345.67和¥12,345.67
我不熟悉欧洲或日本的约定。

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

但是,如果您绝对肯定要让格式遵循货币,而不是用户自定义格式,那么只有不同的格式化程序才是唯一的方法。
您想要的不是常见的用例,因此没有API可以支持该用例。

关于javascript - Intl.NumberFormat有多个语言环境?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48609279/

10-13 00:27