converter.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package common
  2. import (
  3. "fmt"
  4. "math"
  5. "reflect"
  6. "strconv"
  7. "strings"
  8. "github.com/shopspring/decimal"
  9. )
  10. // string to int
  11. func StrToInt(str string) int {
  12. intValue, err := strconv.Atoi(str)
  13. if err != nil {
  14. intValue = int(StrToFloat(str))
  15. }
  16. return intValue
  17. }
  18. // float64 to string
  19. func FloatToStr(f float64) string {
  20. // 如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数
  21. // 如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分)
  22. //func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  23. //f := 100.12345678901234567890123456789
  24. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'f', 5, 64))
  25. // 100.12346
  26. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'g', 5, 64))
  27. // 100.12
  28. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'G', 5, 64))
  29. // 100.12
  30. return strconv.FormatFloat(f, 'f', 2, 64)
  31. }
  32. // string to Float
  33. func StrToFloat(str string) float64 {
  34. if str == "NaN" {
  35. return 0.0
  36. }
  37. str = strings.TrimSpace(str)
  38. str = TrimQff(str)
  39. intValue, err := strconv.ParseFloat(str, 64)
  40. if err != nil {
  41. intValue = 0
  42. }
  43. d := decimal.NewFromFloat(intValue)
  44. //zaplog.LoggerS.Info(n.String())
  45. f, _ := d.Round(2).Float64()
  46. return f
  47. }
  48. // int to string
  49. func IntToStr(intvalue int) string {
  50. return strconv.Itoa(intvalue)
  51. }
  52. // string 去千分符
  53. func TrimQff(str string) string {
  54. return strings.Replace(str, ",", "", -1)
  55. }
  56. // string to Float 不保留两位小数
  57. func StrToFloatAll(str string) float64 {
  58. str = strings.TrimSpace(str)
  59. str = TrimQff(str)
  60. str = strings.ReplaceAll(str, "%", "")
  61. intValue, err := strconv.ParseFloat(str, 64)
  62. if err != nil {
  63. intValue = 0
  64. }
  65. d := decimal.NewFromFloat(intValue)
  66. //zaplog.LoggerS.Info(n.String())
  67. f, _ := d.Float64()
  68. return f
  69. }
  70. // float64 to string
  71. func FloatToIntStr(floatValue float64) string {
  72. //return strconv.FormatFloat(floatValue, 'e', 2, 64)
  73. return strconv.Itoa(int(floatValue))
  74. }
  75. // 不保留两位小数转字符串
  76. func FloatAllToStr(f float64) string {
  77. return strconv.FormatFloat(f, 'f', -1, 64)
  78. }
  79. func FormatAmt(n float64) string {
  80. return strconv.FormatFloat(n, 'f', 2, 64) //格式化金额 保留两位小数(四舍五入)
  81. }
  82. func IsNumeric(s string) bool {
  83. _, err := strconv.Atoi(s)
  84. return err == nil
  85. }
  86. func DecimalDivFF(v1 float64, v2 float64) float64 {
  87. r, _ := decimal.NewFromFloat(v1).Div(decimal.NewFromFloat(v2)).Float64()
  88. return r
  89. }
  90. func Round2(value float64) float64 {
  91. d := decimal.NewFromFloat(value)
  92. //zaplog.LoggerS.Info(n.String())
  93. f, _ := d.Round(2).Float64()
  94. return f
  95. }
  96. // DecimalAddFF 精确相加 小数
  97. func DecimalAddFF(v1 float64, v2 float64) float64 {
  98. r, _ := decimal.NewFromFloat(v1).Add(decimal.NewFromFloat(v2)).Float64()
  99. return r
  100. }
  101. func InterfaceToFloat(unk any) float64 {
  102. var floatType = reflect.TypeOf(float64(0))
  103. var stringType = reflect.TypeOf("")
  104. switch i := unk.(type) {
  105. case float64:
  106. return i
  107. case float32:
  108. return float64(i)
  109. case int64:
  110. return float64(i)
  111. case int32:
  112. return float64(i)
  113. case int:
  114. return float64(i)
  115. case uint64:
  116. return float64(i)
  117. case uint32:
  118. return float64(i)
  119. case uint:
  120. return float64(i)
  121. case string:
  122. f, _ := strconv.ParseFloat(i, 64)
  123. return f
  124. default:
  125. v := reflect.ValueOf(unk)
  126. v = reflect.Indirect(v)
  127. if v.Type().ConvertibleTo(floatType) {
  128. fv := v.Convert(floatType)
  129. return fv.Float()
  130. } else if v.Type().ConvertibleTo(stringType) {
  131. sv := v.Convert(stringType)
  132. s := sv.String()
  133. f, _ := strconv.ParseFloat(s, 64)
  134. return f
  135. } else {
  136. return math.NaN()
  137. }
  138. }
  139. }
  140. // float64 to float64 去掉金额字符串后面的0
  141. func FloatToFloat(f float64) float64 {
  142. ff, _ := strconv.ParseFloat(FloatToStr3(f), 64)
  143. return ff
  144. }
  145. // string to Float
  146. func StrToFloat4(str string) any {
  147. if strings.Contains(str, `*`) {
  148. return str
  149. } else {
  150. if strings.Contains(str, `%`) {
  151. str = strings.ReplaceAll(str, `%`, ``)
  152. str = TrimQff(str)
  153. intValue, err := strconv.ParseFloat(str, 64)
  154. if err != nil {
  155. intValue = 0
  156. }
  157. d := decimal.NewFromFloat(intValue)
  158. //zaplog.LoggerS.Info(n.String())
  159. f, _ := d.Round(2).Float64()
  160. return f / 100
  161. } else {
  162. str = TrimQff(str)
  163. intValue, err := strconv.ParseFloat(str, 64)
  164. if err != nil {
  165. intValue = 0
  166. }
  167. d := decimal.NewFromFloat(intValue)
  168. //zaplog.LoggerS.Info(n.String())
  169. f, _ := d.Round(2).Float64()
  170. return f
  171. }
  172. }
  173. }
  174. // float64 to string 去掉金额字符串后面的0
  175. func FloatToStr3(f float64) string {
  176. ss := strconv.FormatFloat(f, 'f', 2, 64)
  177. return doDecimal(ss)
  178. }
  179. func doDecimal(s string) string {
  180. if strings.Index(s, ".") < 0 {
  181. return s
  182. }
  183. l := len(s)
  184. if strings.HasSuffix(s, "0") {
  185. return doDecimal(s[0 : l-1])
  186. }
  187. if strings.HasSuffix(s, ".") {
  188. return doDecimal(s[0 : l-1])
  189. }
  190. return s
  191. }
  192. func FloatToFloat2(f float64) float64 {
  193. fstr := fmt.Sprintf("%0.2f", f)
  194. return StrToFloat(fstr)
  195. }
  196. // DecimalAddSS 精确相加 字符串
  197. func DecimalAddFS(v1 float64, v2 string) float64 {
  198. v2 = AmountFormat2str(v2)
  199. r := DecimalAddFF(v1, StrToFloat(v2))
  200. return r
  201. }
  202. // string to Float
  203. func AmountFormat2str(str string) string {
  204. return strings.TrimSpace(strings.ReplaceAll(str, ",", ""))
  205. }