将 Decimal 转换为格式化的金额字符串

extension Decimal {
    /// 将 Decimal 转换为格式化的金额字符串
    ///
    /// - Parameters:
    ///   - scale: 小数点后保留的位数,默认保留 2 位(常用于金额)
    ///   - roundingMode: 四舍五入的规则,默认使用银行家舍入法(.bankers)
    ///   - locale: 用于格式化的区域设置,默认使用当前系统区域
    ///   - showSymbol: 是否显示货币符号(如¥、$等),默认显示
    /// - Returns: 格式化后的金额字符串,如 "¥1,234.56" 或 "1,234.56"
    func toMoneyString(scale: Int = 2,
                       roundingMode: NSDecimalNumber.RoundingMode = .bankers,
                       locale: Locale = .current,
                       showSymbol: Bool = false) -> String {
        
        // Step 1: 对 Decimal 值进行四舍五入处理
        var value = self                       // 原始 Decimal 值
        var rounded = Decimal()               // 存放舍入后的值
        NSDecimalRound(&rounded, &value, scale, roundingMode)
        
        // Step 2: 设置 NumberFormatter 格式化器
        let formatter = NumberFormatter()
        formatter.locale = locale                                      // 使用指定地区设置
        formatter.numberStyle = showSymbol ? .currency : .decimal     // 设置格式:带符号或纯数字
        formatter.minimumFractionDigits = scale                       // 保留最少的小数位数
        formatter.maximumFractionDigits = scale                       // 保留最多的小数位数
        formatter.roundingMode = roundingMode.toNumberFormatterRoundingMode // 设置四舍五入策略
        
        // Step 3: 若不显示货币符号,手动清空符号
        if !showSymbol {
            formatter.currencySymbol = ""     // 清除本地货币符号(如 ¥、$)
        }

        // Step 4: 返回格式化后的字符串,若失败返回空字符串
        return formatter.string(from: rounded as NSDecimalNumber) ?? ""
    }
}
extension NSDecimalNumber.RoundingMode {
    /// 将 NSDecimalNumber 的舍入模式映射为 NumberFormatter 的舍入模式
    var toNumberFormatterRoundingMode: NumberFormatter.RoundingMode {
        switch self {
        case .plain:     return .halfUp        // 四舍五入
        case .down:      return .down          // 向零方向舍入
        case .up:        return .up            // 远离零方向舍入
        case .bankers:   return .halfEven      // 银行家舍入法
        @unknown default:
            return .halfEven                  // 默认 fallback
        }
    }
}

仅供参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容