iOS17 Beta+Xcode15 Beta下NumberFormatter无法识别区域货币设置
iOS 17 Beta/Xcode 15 Beta下Locale货币属性异常问题
不少开发者在iOS 17 Beta和Xcode 15 Beta环境下遇到过这个问题,目前来看这属于测试版的兼容性问题,同时也涉及iOS 17对Locale处理的逻辑变更。
问题根源
iOS 17 Beta中Locale.current返回的是en_001(通用英语区域),这个通用区域并没有绑定默认货币信息,因此currency、currency?.identifier会返回nil,currencySymbol则显示通用货币占位符¤。而在iOS 16及之前,Locale.current会返回具体的地区Locale(比如en_US),这类地区Locale有明确绑定的货币属性。
临时解决办法
针对这个问题,可以采用以下几种临时方案:
显式指定目标Locale
直接使用具体的地区Locale来替代Locale.current,确保能获取到正确的货币信息:// 以美元为例,指定en_US区域 let targetLocale = Locale(identifier: "en_US") let formatter = NumberFormatter() formatter.locale = targetLocale formatter.numberStyle = .currency // 格式化示例 if let formattedAmount = formatter.string(from: 99.99 as NSNumber) { print(formattedAmount) // 输出 $99.99 }基于用户偏好语言 fallback 到具体Locale
如果需要适配用户的语言偏好,可以从用户偏好语言列表中提取对应的具体Locale:let preferredLocale = Locale(identifier: Locale.preferredLanguages.first ?? "en_US") let formatter = NumberFormatter() formatter.locale = preferredLocale formatter.numberStyle = .currency直接固定货币符号
如果你的应用只需要固定显示美元符号,也可以直接设置currencySymbol:let formatter = NumberFormatter() formatter.currencySymbol = "$" formatter.numberStyle = .currency
后续注意事项
目前苹果开发者社区已有大量类似反馈,这个问题很大概率会在iOS 17正式版中修复。在Beta版开发阶段,建议避免依赖Locale.current的默认货币属性,尽量显式指定具体的地区Locale来保证货币格式化的稳定性。
内容的提问来源于stack exchange,提问作者NSSpeedForce
相关产品推荐
相关产品推荐

