74 lines
1.7 KiB
Go
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
|
|
}
|