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

在Swift中如何将Decimal类型数字格式化为货币格式?

Swift 低版本兼容 Decimal 转货币格式解决方案

核心使用系统内置的NumberFormatter实现,原生支持Decimal类型,无浮点数精度丢失问题,最低兼容iOS 2.0,完全满足iOS15以下版本的使用需求。

实现步骤

  1. 配置NumberFormatter的货币样式、小数位约束、四舍五入规则
  2. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:03