iOS17中货币符号获取不一致:如何稳定输出$?
iOS17下稳定获取美元符号$的解决方案
问题根源
- 原代码的问题:遍历所有系统可用
Locale,取第一个货币代码匹配的Locale实例。iOS17中同一货币代码(如USD)对应多个Locale(比如en_US、en_CA),不同Locale的货币符号可能不同($和US$),导致输出不稳定。 - 你修改后的代码错误:把判断条件改成了
$0.identifier == code,但Locale的identifier是区域标识(比如en_US),不是货币代码(比如USD),所以根本找不到匹配项,返回nil。
正确实现方式
要稳定输出$,直接基于固定区域(比如美式英语区域en_US)来获取符号,以下两种方案都可行:
方案一:直接调用Locale的新API
func getSymbolForCurrencyCode(code: String) -> String? { // 指定en_US区域,确保USD返回$ let targetLocale = Locale(identifier: "en_US") return targetLocale.currencySymbol(for: code) }
调用getSymbolForCurrencyCode(code: "USD")会稳定返回$。
方案二:使用NumberFormatter(更通用)
如果需要后续做货币格式化,这种方式更适配:
func getSymbolForCurrencyCode(code: String) -> String? { let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.currencyCode = code // 指定en_US区域保证符号为$ formatter.locale = Locale(identifier: "en_US") return formatter.currencySymbol }
注意事项
- 不要再遍历所有
availableIdentifiers,这种方式效率低且结果受系统版本影响,完全不可控。 - iOS16及以上版本推荐使用
currencySymbol(for:)这个新API,替代已废弃的currencyCode属性。
内容的提问来源于stack exchange,提问作者ppp
相关产品推荐
相关产品推荐

