了解 Swift 中货币的 NumberFormatter

Understanding NumberFormatter for currency in Swift

我有一个应用程序,我试图用 NumberFormetter 格式化 Double,但我得到的输出与其他应用程序中的输出不匹配。

这是我正在使用的代码...

let price:Double = 25
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
currencyFormatter.locale = NSLocale.current

let priceFormatter = currencyFormatter.string(for: price)

myLabel.text = priceFormatter

使用上面的代码并在我的应用程序中将 phone 的 Region 设置为中国,我得到 25,00 CNY 但在另外两个第三方应用程序中输出是 CN¥25.00

我做错了什么?

区域设置为中国:

My App
25,00 CNY

Other Apps
CN¥25.00

区域设置为法国:

My App
25,00€

Other Apps
€25,00

但是当区域设置为 United States 时,我在所有三 (3) 个应用程序中得到相同的符号。

区域设置为美国:

My App
.00

Other Apps
.00

我有点担心区域设置为中国时的输出,因为除了符号不同外,我还得到了不同的符号 CNYCN¥.

任何建议,我做错了吗?

剧透其他应用程序做错了,你的输出是正确的!

您可以指定the format您想要的输出。例子:

let number: NSNumber = 25
let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale.init(identifier: "cn_CN") // or "en_US", "fr_FR"
numberFormatter.positiveFormat = "#0.00 ¤"
let price = numberFormatter.string(from: number)

给出输出

25.00 CN¥

您可以更改格式以获得不同的输出:

"#0.00 ¤" => 25.00 CN¥

"#0.00 ¤¤" => 25.00 CNY

"#0.00 ¤¤¤" => 25.00 Chinese yuan

这完全取决于您想做什么。简而言之,在用户界面中显示结果时,它是设备区域设置的函数,而不是相关货币。

例如,如果我显示的是按今天的汇率兑换成欧元的一万美元,您可能会在具有德语区域设置的设备上显示 8.950,95 €。货币代码的数字格式和位置都将针对相关设备进行本地化,而不是货币。

但是,如果我在美国设备上显示相同的结果,我可能会使用习惯的美国 number/currency 格式显示它,例如也许 €8,950.95

FWIW,English-language 风格指南,例如 芝加哥风格手册经济学人风格指南, 证实了这一点方法。我假设“保持观众对外币的期望”也适用于其他语言。

最重要的是,通常应该根据设备区域设置在用户界面中格式化数字,但显然根据所表示的货币使用货币符号和小数位数。