package utility import ( "fmt" "strconv" "strings" "time" "github.com/shopspring/decimal" ) // Float64CutString 保留size位小数 不足则填充0 func Float64CutString(num float64, size int32) string { de := decimal.NewFromFloat(num).Truncate(size) return de.StringFixed(size) } func FloatAddCutFixStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2)).Truncate(size) return result.StringFixed(size) } // FloatCut 按保留的小数点位数,去掉多余的小数 func FloatCut(num float64, size int32) float64 { de := decimal.NewFromFloat(num) str := de.Truncate(size) result, _ := str.Float64() return result } // FloatCutStr 按保留的小数点位数,去掉多余的小数 非四舍五入 func FloatCutStr(num float64, size int32) string { if num == 0 { return `0` } de := decimal.NewFromFloat(num) str := de.Truncate(size) result := str.String() return result } // StringFloat64Cut 保留8为小数后边为0不截取 func StringFloat64Cut(num string, size int32) string { // 清理输入字符串,去除空字符和其他非数字字符 if strings.Contains(num, "x00") { fmt.Sprintf("打印信息", num) } cleanedNum := strings.TrimRight(num, "\x00") // 去除空字符 cleanedNum = strings.TrimSpace(cleanedNum) // 去除空格 cleanedNum = strings.ReplaceAll(strings.ReplaceAll(cleanedNum, ",", ""), "\x00", "") // 去除逗号 de, err := decimal.NewFromString(cleanedNum) if err != nil { return "" } return de.Truncate(size).String() } // StrToFloatCut 按保留的小数点位数,去掉多余的小数 非四舍五入 func StrToFloatCut(num string, size int32) float64 { if num == "" { return 0 } de, _ := decimal.NewFromString(num) str := de.Truncate(size) result, _ := str.Float64() return result } // FloatThousand 对float进行千分位处理返回字符串,比如2568965463.256545 => 2,568,965,463.256545 func FloatThousand(num float64) string { if num <= 1000 { return decimal.NewFromFloat(num).String() } n := decimal.NewFromFloat(num).String() dec := "" if strings.Index(n, ".") != -1 { dec = n[strings.Index(n, ".")+1:] n = n[0:strings.Index(n, ".")] } for i := 0; i <= len(n); i = i + 4 { a := n[0 : len(n)-i] b := n[len(n)-i:] n = a + "," + b } if n[0:1] == "," { n = n[1:] } if n[len(n)-1:] == "," { n = n[0 : len(n)-1] } if dec != "" { n = n + "." + dec } return n } // Float8ToString 按保留的小数点8位数,去掉多余的小数, return string func Float8ToString(num float64) string { return FloatToString(num, 8) } // FloatAdd float + float func FloatAdd(num1, num2 float64) float64 { result := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2)) f, _ := result.Float64() return f } func FloatAddCutStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2)) return result.Truncate(size).String() } func FloatAddCut(num1, num2 float64, size int32) float64 { result := decimal.NewFromFloat(num1).Add(decimal.NewFromFloat(num2)) f, _ := result.Truncate(size).Float64() return f } // FloatSub float - float func FloatSub(num1, num2 float64) float64 { if num2 == 0 { return num1 } result := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(num2)) f, _ := result.Float64() return f } // FloatSubCut float - float func FloatSubCut(num1, num2 float64, size int32) float64 { if num2 == 0 { return num1 } result := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(num2)) f, _ := result.Truncate(size).Float64() return f } // FloatSubCutStr float - float func FloatSubCutStr(num1, num2 float64, size int32) string { if num2 == 0 { return decimal.NewFromFloat(num1).Truncate(size).String() } result := decimal.NewFromFloat(num1).Sub(decimal.NewFromFloat(num2)) f := result.Truncate(size).String() return f } // FloatDiv float / float 两数相除 func FloatDiv(num1, num2 float64) float64 { result := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(num2)) f, _ := result.Float64() return f } func FloatDivCutStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(num2)) result = result.Truncate(size) s := result.String() return s } func FloatDivCutFixStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(num2)) return result.Truncate(size).StringFixed(size) } func FloatDivCut(num1, num2 float64, size int32) float64 { result := decimal.NewFromFloat(num1).Div(decimal.NewFromFloat(num2)) result = result.Truncate(size) f, _ := result.Float64() return f } // FloatMul float * float func FloatMul(num1, num2 float64) float64 { result := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(num2)) f, _ := result.Float64() return f } // FloatMulCut 两数相乘并返回小数点后size位的float64 func FloatMulCut(num1, num2 float64, size int32) float64 { result := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(num2)) result = result.Truncate(size) f, _ := result.Float64() return f } // FloatMulCutStr float * float 两数相乘并返回指定小数位数的float64 返回字符串 func FloatMulCutStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(num2)) result = result.Truncate(size) return result.String() } // FloatMulCutFixStr float * float 两数相乘并返回指定小数位数的float64 返回字符串 func FloatMulCutFixStr(num1, num2 float64, size int32) string { result := decimal.NewFromFloat(num1).Mul(decimal.NewFromFloat(num2)) result = result.Truncate(size) return result.StringFixed(size) } // GetTotalAmt 计算需要冻结的币 数量*??/价格 func GetTotalAmt(num int, price, contractVal float64, size int32) float64 { de := decimal.NewFromInt(int64(num)). Mul(decimal.NewFromFloat(contractVal)). Div(decimal.NewFromFloat(price)). Truncate(size) result2, _ := de.Float64() return result2 } func GetNonce() string { s := strconv.FormatInt(time.Now().UnixNano(), 10)[0:11] return s } // IsEqual 比对2个float64 是否相等 func IsEqual(num1, num2 float64, size int32) bool { n1 := decimal.NewFromFloat(num1).Truncate(size) n2 := decimal.NewFromFloat(num2).Truncate(size) return n1.Equal(n2) } // GetDealAmt 根据下单张数,下单总的冻结金额,计算本次成交金额 func GetDealAmt(num, totalNum int, totalAmt float64, size int32) float64 { if num == totalNum { return totalAmt } de := decimal.NewFromFloat(totalAmt). Div(decimal.NewFromInt(int64(num))). Mul(decimal.NewFromInt(int64(num))). Truncate(size) result2, _ := de.Float64() return result2 } func ToFloat64(v interface{}) float64 { if v == nil { return 0.0 } switch v.(type) { case float64: return v.(float64) case string: vStr := v.(string) vF, _ := strconv.ParseFloat(vStr, 64) return vF default: panic("to float64 error.") } } func ToInt(v interface{}) int { if v == nil { return 0 } switch v.(type) { case string: vStr := v.(string) vInt, _ := strconv.Atoi(vStr) return vInt case int: return v.(int) case float64: vF := v.(float64) return int(vF) default: panic("to int error.") } } func ToInt64(v interface{}) int64 { if v == nil { return 0 } switch v.(type) { case float64: return int64(v.(float64)) default: vv := fmt.Sprint(v) if vv == "" { return 0 } vvv, err := strconv.ParseInt(vv, 0, 64) if err != nil { return 0 } return vvv } }