ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
~~~ /* Package toolutilv4 提供了一组通用工具函数,用于常见的计算和处理操作。 函数目录: - CalculateComparison: 计算环比/同比增长率 - CalculatePercentage: 计算百分比并保留指定位数 - GenerateOrderNo: 生成唯一订单号 - NameDesensitization: 名称脱敏 */ package toolutilv4 import ( "fmt" "github.com/shopspring/decimal" "math/rand" "strconv" "time" "unicode/utf8" ) // ToolCommon 是用于时间处理的工具函数实例 var ToolCommon = toolCommonUtil{} type toolCommonUtil struct{} // CalculatePercentage 计算百分比并保留指定位数 func (c *toolCommonUtil) CalculatePercentage(num float64, total float64, decimalPlaces int32) float64 { if total == 0 { return 0 } n := decimal.NewFromFloat(num) t := decimal.NewFromFloat(total) result, _ := n.Div(t).Mul(decimal.NewFromFloat(100)).Round(decimalPlaces).Float64() return result } // CalculateComparison 计算环比/同比增长率 func (c *toolCommonUtil) CalculateComparison(thisValue float64, lastValue float64, decimalPlaces int32) float64 { if lastValue == 0 { return 0 } now := decimal.NewFromFloat(thisValue) last := decimal.NewFromFloat(lastValue) result, _ := now.Sub(last).Div(last).Mul(decimal.NewFromInt(100)).Round(decimalPlaces).Float64() return result } // GenerateOrderNo 生成唯一订单号 // 由于本方法仅使用了时间戳和一个大写字母进行拼接,在高并发场景下可能会存在重复的情况。 // 如果需要更高的唯一性保证,可以考虑使用更复杂的算法或者引入分布式 ID 生成器等方案 func (c *toolCommonUtil) GenerateOrderNo(prefix string) string { // 生成随机数种子 rand.Seed(time.Now().UnixNano()) // 生成当前时间戳字符串 timestamp := strconv.FormatInt(time.Now().Unix(), 10) // 生成随机数字符串(范围在 0-25 之间) randomNum1 := rand.Intn(26) randomNum2 := rand.Intn(26) // 将随机数转换成对应的大写字母 randomChar1 := string('A' + rune(randomNum1)) randomChar2 := string('A' + rune(randomNum2)) // 拼接出订单号 return prefix + timestamp + randomChar1 + randomChar2 } // NameDesensitization 名称脱敏 // 对名称进行脱敏处理,将名称的首尾字符保留,其余字符替换为 '*' // 若名称长度为2,只保留首字母;若名称长度大于2,则首尾字符保留,其余字符替换为 '*' func (c *toolCommonUtil) NameDesensitization(name string) string { if utf8.RuneCountInString(name) == 2 { firstRune, _ := utf8.DecodeRuneInString(name) name = fmt.Sprintf("%c*", firstRune) } else if utf8.RuneCountInString(name) >= 2 { firstRune, _ := utf8.DecodeRuneInString(name) lastRune, _ := utf8.DecodeLastRuneInString(name) name = fmt.Sprintf("%c*%c", firstRune, lastRune) } return name } ~~~