Files
exchange_go/pkg/utility/floathelper.go
2025-02-06 11:14:33 +08:00

302 lines
7.4 KiB
Go

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
}
}