123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- 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, ",", ""))
- }
|