NumberFormatter格式化货币返回多余'US'前缀如何解决
美元货币格式化移除符号前US前缀方案
问题复现
开发中使用NumberFormatter做美元格式化的代码如下:
let price: Double = 1 let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.currencyCode = "USD" formatter.locale = Locale(identifier: "en_US") let priceString = formatter.string(from: NSNumber(value: Double(price / 100)))
执行后得到的结果为US$ 0,01,货币符号前多了多余的US前缀,不符合预期的标准美元格式。
问题原因
NumberFormatter内置了货币歧义规避逻辑:由于全球多个国家/地区的货币都使用$作为符号(如美元、加元、澳元),在部分iOS/macOS系统版本中,如果当前设备的系统区域与formatter设置的locale不一致,就会自动在货币符号前拼接国家缩写前缀做区分。哪怕已经手动指定了en_US locale和USD货币代码,也可能触发这个规则,生成带US前缀的货币符号。
修复方案
优先推荐:显式指定货币符号(兼容性最好)
直接给formatter的currencySymbol属性赋值,强制覆盖系统自动生成的带前缀的符号,不受系统版本、设备区域设置的影响,最适合面向终端用户展示的场景,只需要新增一行配置:formatter.currencySymbol = "$"修改后的完整代码:
let price: Double = 1 let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.currencyCode = "USD" formatter.locale = Locale(identifier: "en_US") // 强制指定货币符号,移除自动生成的US前缀 formatter.currencySymbol = "$" let priceString = formatter.string(from: NSNumber(value: Double(price / 100))) // 输出结果为标准美元格式:$0.01可选方案:使用POSIX标准区域(适合固定格式场景)
如果不希望硬编码货币符号,可以将formatter的locale替换为en_US_POSIX,该标准区域下的美元格式化默认不会生成US前缀。但需要注意:en_US_POSIX的格式规则是固定的POSIX标准,不会跟随用户的系统区域偏好(比如千分位、小数点样式)调整,仅适合和后端交互的固定格式传值场景,不适合前端用户展示:formatter.locale = Locale(identifier: "en_US_POSIX")
内容的提问来源于stack exchange,提问作者Ramy Al Zuhouri
相关产品推荐
相关产品推荐

