You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:52:47