在Swift中如何将Decimal类型数字格式化为货币格式?
Swift 低版本兼容 Decimal 转货币格式解决方案
核心使用系统内置的NumberFormatter实现,原生支持Decimal类型,无浮点数精度丢失问题,最低兼容iOS 2.0,完全满足iOS15以下版本的使用需求。
实现步骤
- 配置
NumberFormatter的货币样式、小数位约束、四舍五入规则 - 将Decimal桥接为NSNumber传入Formatter获取格式化结果
代码示例
基础实现
func formatDecimalToCurrency(_ value: Decimal) -> String? { let formatter = NumberFormatter() // 设置为货币格式化样式 formatter.numberStyle = .currency // 固定美元区域(如需适配系统地区可删除该行) formatter.locale = Locale(identifier: "en_US_POSIX") // 强制保留2位小数,匹配需求 formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 // 四舍五入规则(默认即为halfUp,可按需调整) formatter.roundingMode = .halfUp return formatter.string(from: value as NSNumber) }
测试效果
// 测试用例1:25.1 let val1 = Decimal(string: "25.1")! print(formatDecimalToCurrency(val1) ?? "") // 输出:$25.10 // 测试用例2:25 let val2 = Decimal(string: "25")! print(formatDecimalToCurrency(val2) ?? "") // 输出:$25.00 // 测试用例3:25.4575 let val3 = Decimal(string: "25.4575")! print(formatDecimalToCurrency(val3) ?? "") // 输出:$25.46
性能优化版本
NumberFormatter初始化开销较高,高频使用时建议做成静态全局实例,避免重复创建:
// 全局静态Formatter实例 private let sharedCurrencyFormatter: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.locale = Locale(identifier: "en_US_POSIX") formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 formatter.roundingMode = .halfUp return formatter }() func optimizedFormatCurrency(_ value: Decimal) -> String? { sharedCurrencyFormatter.string(from: value as NSNumber) }
注意事项
- 不要将Decimal先转为Double/Float再做格式化,会导致精度丢失,Decimal直接桥接NSNumber无精度损耗
- 如需修改货币符号、千分位显示、地区适配等规则,直接调整
NumberFormatter对应的属性即可
内容的提问来源于stack exchange,提问作者Flarosa
相关产品推荐
相关产品推荐

