extension Decimal {
/// 將 Decimal 轉(zhuǎn)換為格式化的金額字符串
///
/// - Parameters:
/// - scale: 小數(shù)點后保留的位數(shù),默認保留 2 位(常用于金額)
/// - roundingMode: 四舍五入的規(guī)則,默認使用銀行家舍入法(.bankers)
/// - locale: 用于格式化的區(qū)域設(shè)置,默認使用當(dāng)前系統(tǒng)區(qū)域
/// - 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: 設(shè)置 NumberFormatter 格式化器
let formatter = NumberFormatter()
formatter.locale = locale // 使用指定地區(qū)設(shè)置
formatter.numberStyle = showSymbol ? .currency : .decimal // 設(shè)置格式:帶符號或純數(shù)字
formatter.minimumFractionDigits = scale // 保留最少的小數(shù)位數(shù)
formatter.maximumFractionDigits = scale // 保留最多的小數(shù)位數(shù)
formatter.roundingMode = roundingMode.toNumberFormatterRoundingMode // 設(shè)置四舍五入策略
// 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
}
}
}
僅供參考