converter.go 4.7 KB

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