ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
~~~ package toolutilv3 import ( "fmt" "github.com/shopspring/decimal" "math/rand" "strconv" "time" "unicode/utf8" ) /* CalculatePercentage 计算百分比并保留指定位数 CalculateComparison 计算环比/同比增长率 GenerateOrderNo 生成唯一订单号 NameDesensitization 名称脱敏 */ //备注 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 } /* 同比增长率=(本期数-同期数)/同期数×100% 环比增长率=(本期数-上期数)/上期数×100%。 */ // 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 } /* 由于本方法仅仅使用了时间戳和一个大写字母进行拼接,因此在高并发场景下可能会存在重复的情况。 如果需要更高的唯一性保证,可以考虑使用更复杂的算法或者引入分布式 ID 生成器等方案 */ // GenerateOrderNo 生成唯一订单号 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 名称脱敏 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 } ~~~