302 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
						|
	}
 | 
						|
}
 |