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