package common import ( "fmt" "math" "reflect" "strconv" "strings" "github.com/shopspring/decimal" ) // string to int func StrToInt(str string) int { intValue, err := strconv.Atoi(str) if err != nil { intValue = int(StrToFloat(str)) } return intValue } // float64 to string func FloatToStr(f float64) string { // 如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数 // 如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分) //func FormatFloat(f float64, fmt byte, prec, bitSize int) string //f := 100.12345678901234567890123456789 //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'f', 5, 64)) // 100.12346 //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'g', 5, 64)) // 100.12 //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'G', 5, 64)) // 100.12 return strconv.FormatFloat(f, 'f', 2, 64) } // string to Float func StrToFloat(str string) float64 { if str == "NaN" { return 0.0 } str = strings.TrimSpace(str) str = TrimQff(str) intValue, err := strconv.ParseFloat(str, 64) if err != nil { intValue = 0 } d := decimal.NewFromFloat(intValue) //zaplog.LoggerS.Info(n.String()) f, _ := d.Round(2).Float64() return f } // int to string func IntToStr(intvalue int) string { return strconv.Itoa(intvalue) } // string 去千分符 func TrimQff(str string) string { return strings.Replace(str, ",", "", -1) } // string to Float 不保留两位小数 func StrToFloatAll(str string) float64 { str = strings.TrimSpace(str) str = TrimQff(str) str = strings.ReplaceAll(str, "%", "") intValue, err := strconv.ParseFloat(str, 64) if err != nil { intValue = 0 } d := decimal.NewFromFloat(intValue) //zaplog.LoggerS.Info(n.String()) f, _ := d.Float64() return f } // float64 to string func FloatToIntStr(floatValue float64) string { //return strconv.FormatFloat(floatValue, 'e', 2, 64) return strconv.Itoa(int(floatValue)) } // 不保留两位小数转字符串 func FloatAllToStr(f float64) string { return strconv.FormatFloat(f, 'f', -1, 64) } func FormatAmt(n float64) string { return strconv.FormatFloat(n, 'f', 2, 64) //格式化金额 保留两位小数(四舍五入) } func IsNumeric(s string) bool { _, err := strconv.Atoi(s) return err == nil } func DecimalDivFF(v1 float64, v2 float64) float64 { r, _ := decimal.NewFromFloat(v1).Div(decimal.NewFromFloat(v2)).Float64() return r } func Round2(value float64) float64 { d := decimal.NewFromFloat(value) //zaplog.LoggerS.Info(n.String()) f, _ := d.Round(2).Float64() return f } // DecimalAddFF 精确相加 小数 func DecimalAddFF(v1 float64, v2 float64) float64 { r, _ := decimal.NewFromFloat(v1).Add(decimal.NewFromFloat(v2)).Float64() return r } func InterfaceToFloat(unk any) float64 { var floatType = reflect.TypeOf(float64(0)) var stringType = reflect.TypeOf("") switch i := unk.(type) { case float64: return i case float32: return float64(i) case int64: return float64(i) case int32: return float64(i) case int: return float64(i) case uint64: return float64(i) case uint32: return float64(i) case uint: return float64(i) case string: f, _ := strconv.ParseFloat(i, 64) return f default: v := reflect.ValueOf(unk) v = reflect.Indirect(v) if v.Type().ConvertibleTo(floatType) { fv := v.Convert(floatType) return fv.Float() } else if v.Type().ConvertibleTo(stringType) { sv := v.Convert(stringType) s := sv.String() f, _ := strconv.ParseFloat(s, 64) return f } else { return math.NaN() } } } // float64 to float64 去掉金额字符串后面的0 func FloatToFloat(f float64) float64 { ff, _ := strconv.ParseFloat(FloatToStr3(f), 64) return ff } // string to Float func StrToFloat4(str string) any { if strings.Contains(str, `*`) { return str } else { if strings.Contains(str, `%`) { str = strings.ReplaceAll(str, `%`, ``) str = TrimQff(str) intValue, err := strconv.ParseFloat(str, 64) if err != nil { intValue = 0 } d := decimal.NewFromFloat(intValue) //zaplog.LoggerS.Info(n.String()) f, _ := d.Round(2).Float64() return f / 100 } else { str = TrimQff(str) intValue, err := strconv.ParseFloat(str, 64) if err != nil { intValue = 0 } d := decimal.NewFromFloat(intValue) //zaplog.LoggerS.Info(n.String()) f, _ := d.Round(2).Float64() return f } } } // float64 to string 去掉金额字符串后面的0 func FloatToStr3(f float64) string { ss := strconv.FormatFloat(f, 'f', 2, 64) return doDecimal(ss) } func doDecimal(s string) string { if strings.Index(s, ".") < 0 { return s } l := len(s) if strings.HasSuffix(s, "0") { return doDecimal(s[0 : l-1]) } if strings.HasSuffix(s, ".") { return doDecimal(s[0 : l-1]) } return s } func FloatToFloat2(f float64) float64 { fstr := fmt.Sprintf("%0.2f", f) return StrToFloat(fstr) } // DecimalAddSS 精确相加 字符串 func DecimalAddFS(v1 float64, v2 string) float64 { v2 = AmountFormat2str(v2) r := DecimalAddFF(v1, StrToFloat(v2)) return r } // string to Float func AmountFormat2str(str string) string { return strings.TrimSpace(strings.ReplaceAll(str, ",", "")) }