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

时间:2018-02-04 14:43:33

标签: javascript internationalization number-formatting

我必须处理三种不同的货币:美元,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);

1 个答案:

答案 0 :(得分:2)

我对真正需要真正做到这一点感到怀疑(多个语言环境)。

想想会看到这个的用户。

它们用于查看某个区域设置中的内容,并且可能不知道某个货币的“区域设置约定”。

但事实是,货币并不能确定格式。 如果我是美国人,那么我预计会看到12,345.67美元和12,345.67欧元以及12,345.67日元 我不熟悉欧洲或日本的惯例。

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

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