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
}
}
}
仅供参考