>---- 更新 三月 28, 2017 ----
当您通过 Xcode 中的"编辑方案"设置应用程序的语言和区域时,您将获得组合的区域设置标识符es-419_MX
。但是,当您通过进入设置更改设备/模拟器的实际语言和区域时,您将获得"正确"的区域设置标识符es_MX
,同时保持es-419
的语言代码,这有效地解决了几乎所有用例的问题。
// After setting language and region in Edit Scheme from Xcode
print(Bundle.main.preferredLocalizations) // ["es-419", "es"]
print(Locale.current) // es-419_MX (current)
// After setting the language and region from Settings
print(Bundle.main.preferredLocalizations) // ["es-419", "es"]
print(Locale.current) // es_MX (current)
----/更新----
我正在将我的应用程序本地化为拉丁美洲西班牙语 (es-419
)。当我尝试使用NumberFormatter
显示本地化货币时,iOS 返回一个圣甲虫¤
而不是美元符号$
。
例如,如果用户的区域是墨西哥,则区域代码将es-419_MX
。下面的代码不返回$
,而是返回¤
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "es-419_MX")
formatter.numberStyle = .currency
formatter.currencySymbol // ¤
如果我删除"419",我会得到正确的货币符号:
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "es_MX")
formatter.numberStyle = .currency
formatter.currencySymbol // $
当Locale.current
返回es-419_MX
时,是否可以获得正确的货币符号?还是我将不得不求助于从区域设置代码中删除419
实例的黑客?
实际代码:
func localizedCurrency(value: Double) -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale.current
return formatter.string(from: NSNumber(value: value)) ?? "$(value)"
}
你必须做黑客,或者你必须针对每个国家/地区。
由于es_419
是所有拉丁美洲国家/地区的通用规范,因此无法"猜测"您希望显示$
。
es_419
区域设置"父"下的不同国家/地区具有不同的货币字符标准。例如,玻利维亚的货币符号是Bs
。
ICU 区域设置"西班牙语(玻利维亚)"(es_BO)