174 lines
3.9 KiB
Go
174 lines
3.9 KiB
Go
package tools
|
||
|
||
import (
|
||
"fmt"
|
||
"math"
|
||
)
|
||
|
||
// MoneyCalculator 金额计算工具(以分为单位)
|
||
type MoneyCalculator struct{}
|
||
|
||
// NewMoneyCalculator 创建金额计算器
|
||
func NewMoneyCalculator() *MoneyCalculator {
|
||
return &MoneyCalculator{}
|
||
}
|
||
|
||
// YuanToCents 元转分
|
||
func (m *MoneyCalculator) YuanToCents(yuan float64) int64 {
|
||
return int64(math.Round(yuan * 100))
|
||
}
|
||
|
||
// CentsToYuan 分转元
|
||
func (m *MoneyCalculator) CentsToYuan(cents int64) float64 {
|
||
return float64(cents) / 100
|
||
}
|
||
|
||
// FormatYuan 格式化显示金额(分转元,保留2位小数)
|
||
func (m *MoneyCalculator) FormatYuan(cents int64) string {
|
||
return fmt.Sprintf("%.2f", m.CentsToYuan(cents))
|
||
}
|
||
|
||
// Add 金额相加
|
||
func (m *MoneyCalculator) Add(amount1, amount2 int64) int64 {
|
||
return amount1 + amount2
|
||
}
|
||
|
||
// Subtract 金额相减
|
||
func (m *MoneyCalculator) Subtract(amount1, amount2 int64) int64 {
|
||
return amount1 - amount2
|
||
}
|
||
|
||
// Multiply 金额乘法(金额 * 数量)
|
||
func (m *MoneyCalculator) Multiply(amount int64, quantity int) int64 {
|
||
return amount * int64(quantity)
|
||
}
|
||
|
||
// MultiplyFloat 金额乘法(金额 * 浮点数,如折扣)
|
||
func (m *MoneyCalculator) MultiplyFloat(amount int64, rate float64) int64 {
|
||
return int64(math.Round(float64(amount) * rate))
|
||
}
|
||
|
||
// Divide 金额除法(平均分配)
|
||
func (m *MoneyCalculator) Divide(amount int64, count int) int64 {
|
||
if count <= 0 {
|
||
return 0
|
||
}
|
||
return amount / int64(count)
|
||
}
|
||
|
||
// CalculateDiscount 计算折扣金额
|
||
func (m *MoneyCalculator) CalculateDiscount(originalAmount int64, discountRate float64) int64 {
|
||
if discountRate <= 0 || discountRate >= 1 {
|
||
return 0
|
||
}
|
||
return int64(math.Round(float64(originalAmount) * discountRate))
|
||
}
|
||
|
||
// CalculatePercentage 计算百分比金额
|
||
func (m *MoneyCalculator) CalculatePercentage(amount int64, percentage float64) int64 {
|
||
return int64(math.Round(float64(amount) * percentage / 100))
|
||
}
|
||
|
||
// Max 取最大金额
|
||
func (m *MoneyCalculator) Max(amounts ...int64) int64 {
|
||
if len(amounts) == 0 {
|
||
return 0
|
||
}
|
||
max := amounts[0]
|
||
for _, amount := range amounts[1:] {
|
||
if amount > max {
|
||
max = amount
|
||
}
|
||
}
|
||
return max
|
||
}
|
||
|
||
// Min 取最小金额
|
||
func (m *MoneyCalculator) Min(amounts ...int64) int64 {
|
||
if len(amounts) == 0 {
|
||
return 0
|
||
}
|
||
min := amounts[0]
|
||
for _, amount := range amounts[1:] {
|
||
if amount < min {
|
||
min = amount
|
||
}
|
||
}
|
||
return min
|
||
}
|
||
|
||
// IsPositive 判断是否为正数
|
||
func (m *MoneyCalculator) IsPositive(amount int64) bool {
|
||
return amount > 0
|
||
}
|
||
|
||
// IsZero 判断是否为零
|
||
func (m *MoneyCalculator) IsZero(amount int64) bool {
|
||
return amount == 0
|
||
}
|
||
|
||
// IsNegative 判断是否为负数
|
||
func (m *MoneyCalculator) IsNegative(amount int64) bool {
|
||
return amount < 0
|
||
}
|
||
|
||
// Equal 判断金额是否相等
|
||
func (m *MoneyCalculator) Equal(amount1, amount2 int64) bool {
|
||
return amount1 == amount2
|
||
}
|
||
|
||
// Greater 判断第一个金额是否大于第二个
|
||
func (m *MoneyCalculator) Greater(amount1, amount2 int64) bool {
|
||
return amount1 > amount2
|
||
}
|
||
|
||
// Less 判断第一个金额是否小于第二个
|
||
func (m *MoneyCalculator) Less(amount1, amount2 int64) bool {
|
||
return amount1 < amount2
|
||
}
|
||
|
||
// Sum 计算金额总和
|
||
func (m *MoneyCalculator) Sum(amounts ...int64) int64 {
|
||
var total int64
|
||
for _, amount := range amounts {
|
||
total += amount
|
||
}
|
||
return total
|
||
}
|
||
|
||
// SplitAmount 金额分摊(处理分摊不均的情况)
|
||
func (m *MoneyCalculator) SplitAmount(totalAmount int64, count int) []int64 {
|
||
if count <= 0 {
|
||
return []int64{}
|
||
}
|
||
|
||
baseAmount := totalAmount / int64(count)
|
||
remainder := totalAmount % int64(count)
|
||
|
||
amounts := make([]int64, count)
|
||
for i := 0; i < count; i++ {
|
||
amounts[i] = baseAmount
|
||
if int64(i) < remainder {
|
||
amounts[i]++
|
||
}
|
||
}
|
||
|
||
return amounts
|
||
}
|
||
|
||
// 全局金额计算器实例
|
||
var Money = NewMoneyCalculator()
|
||
|
||
// 便捷函数
|
||
func YuanToCents(yuan float64) int64 {
|
||
return Money.YuanToCents(yuan)
|
||
}
|
||
|
||
func CentsToYuan(cents int64) float64 {
|
||
return Money.CentsToYuan(cents)
|
||
}
|
||
|
||
func FormatYuan(cents int64) string {
|
||
return Money.FormatYuan(cents)
|
||
}
|