1
This commit is contained in:
301
pkg/utility/floathelper.go
Normal file
301
pkg/utility/floathelper.go
Normal file
@ -0,0 +1,301 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user