Files
server/app/utils/balance_formatter.go
2026-01-16 15:49:34 +08:00

74 lines
1.7 KiB
Go

package utils
import (
"fmt"
"math"
"goravel/app/models"
)
// FormatBalance 根据货币的小数位数格式化余额
// 如果货币没有小数(decimalPlaces = 0),则不返回小数部分
func FormatBalance(balance float64, currency *models.Currency) float64 {
if currency == nil {
// 如果没有货币信息,默认使用2位小数
return math.Round(balance*100) / 100
}
decimalPlaces := currency.DecimalPlaces
if decimalPlaces < 0 {
decimalPlaces = 0
}
if decimalPlaces > 8 {
decimalPlaces = 8
}
// 计算精度倍数
multiplier := math.Pow(10, float64(decimalPlaces))
// 四舍五入到指定小数位数
formatted := math.Round(balance*multiplier) / multiplier
return formatted
}
// FormatBalanceString 格式化余额为字符串(去除末尾多余的0)
func FormatBalanceString(balance float64, currency *models.Currency) string {
formatted := FormatBalance(balance, currency)
if currency == nil {
return fmt.Sprintf("%.2f", formatted)
}
decimalPlaces := currency.DecimalPlaces
if decimalPlaces < 0 {
decimalPlaces = 0
}
if decimalPlaces > 8 {
decimalPlaces = 8
}
// 如果小数位数为0,使用整数格式
if decimalPlaces == 0 {
return fmt.Sprintf("%.0f", formatted)
}
// 格式化字符串,去除末尾的0
format := fmt.Sprintf("%%.%df", decimalPlaces)
result := fmt.Sprintf(format, formatted)
// 去除末尾的0和小数点(如果小数部分全为0)
if decimalPlaces > 0 {
// 去除末尾的0
for len(result) > 0 && result[len(result)-1] == '0' {
result = result[:len(result)-1]
}
// 如果最后是小数点,也去除
if len(result) > 0 && result[len(result)-1] == '.' {
result = result[:len(result)-1]
}
}
return result
}