converter.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package common
  2. import (
  3. "fmt"
  4. "github.com/go-rod/rod"
  5. "math"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "github.com/shopspring/decimal"
  10. )
  11. var MonthNum1 = map[string]string{
  12. "01": "1月",
  13. "02": "2月",
  14. "03": "3月",
  15. "04": "4月",
  16. "05": "5月",
  17. "06": "6月",
  18. "07": "7月",
  19. "08": "8月",
  20. "09": "9月",
  21. "10": "10月",
  22. "11": "11月",
  23. "12": "12月",
  24. }
  25. // string to int
  26. func StrToInt(str string) int {
  27. intValue, err := strconv.Atoi(str)
  28. if err != nil {
  29. intValue = int(StrToFloat(str))
  30. }
  31. return intValue
  32. }
  33. // float64 to string
  34. func FloatToStr(f float64) string {
  35. // 如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数
  36. // 如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分)
  37. //func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  38. //f := 100.12345678901234567890123456789
  39. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'f', 5, 64))
  40. // 100.12346
  41. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'g', 5, 64))
  42. // 100.12
  43. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'G', 5, 64))
  44. // 100.12
  45. return strconv.FormatFloat(f, 'f', 2, 64)
  46. }
  47. // string to Float
  48. func StrToFloat(str string) float64 {
  49. if str == "NaN" {
  50. return 0.0
  51. }
  52. str = strings.TrimSpace(str)
  53. str = TrimQff(str)
  54. intValue, err := strconv.ParseFloat(str, 64)
  55. if err != nil {
  56. intValue = 0
  57. }
  58. d := decimal.NewFromFloat(intValue)
  59. //zaplog.LoggerS.Info(n.String())
  60. f, _ := d.Round(2).Float64()
  61. return f
  62. }
  63. // int to string
  64. func IntToStr(intvalue int) string {
  65. return strconv.Itoa(intvalue)
  66. }
  67. // string 去千分符
  68. func TrimQff(str string) string {
  69. return strings.Replace(str, ",", "", -1)
  70. }
  71. // string to Float 不保留两位小数
  72. func StrToFloatAll(str string) float64 {
  73. str = strings.TrimSpace(str)
  74. str = TrimQff(str)
  75. str = strings.ReplaceAll(str, "%", "")
  76. intValue, err := strconv.ParseFloat(str, 64)
  77. if err != nil {
  78. intValue = 0
  79. }
  80. d := decimal.NewFromFloat(intValue)
  81. //zaplog.LoggerS.Info(n.String())
  82. f, _ := d.Float64()
  83. return f
  84. }
  85. // float64 to string
  86. func FloatToIntStr(floatValue float64) string {
  87. //return strconv.FormatFloat(floatValue, 'e', 2, 64)
  88. return strconv.Itoa(int(floatValue))
  89. }
  90. // 不保留两位小数转字符串
  91. func FloatAllToStr(f float64) string {
  92. return strconv.FormatFloat(f, 'f', -1, 64)
  93. }
  94. func FormatAmt(n float64) string {
  95. return strconv.FormatFloat(n, 'f', 2, 64) //格式化金额 保留两位小数(四舍五入)
  96. }
  97. func IsNumeric(s string) bool {
  98. _, err := strconv.Atoi(s)
  99. return err == nil
  100. }
  101. func DecimalDivFF(v1 float64, v2 float64) float64 {
  102. r, _ := decimal.NewFromFloat(v1).Div(decimal.NewFromFloat(v2)).Float64()
  103. return r
  104. }
  105. func Round2(value float64) float64 {
  106. d := decimal.NewFromFloat(value)
  107. //zaplog.LoggerS.Info(n.String())
  108. f, _ := d.Round(2).Float64()
  109. return f
  110. }
  111. // DecimalAddFF 精确相加 小数
  112. func DecimalAddFF(v1 float64, v2 float64) float64 {
  113. r, _ := decimal.NewFromFloat(v1).Add(decimal.NewFromFloat(v2)).Float64()
  114. return r
  115. }
  116. func InterfaceToFloat(unk any) float64 {
  117. var floatType = reflect.TypeOf(float64(0))
  118. var stringType = reflect.TypeOf("")
  119. switch i := unk.(type) {
  120. case float64:
  121. return i
  122. case float32:
  123. return float64(i)
  124. case int64:
  125. return float64(i)
  126. case int32:
  127. return float64(i)
  128. case int:
  129. return float64(i)
  130. case uint64:
  131. return float64(i)
  132. case uint32:
  133. return float64(i)
  134. case uint:
  135. return float64(i)
  136. case string:
  137. f, _ := strconv.ParseFloat(i, 64)
  138. return f
  139. default:
  140. v := reflect.ValueOf(unk)
  141. v = reflect.Indirect(v)
  142. if v.Type().ConvertibleTo(floatType) {
  143. fv := v.Convert(floatType)
  144. return fv.Float()
  145. } else if v.Type().ConvertibleTo(stringType) {
  146. sv := v.Convert(stringType)
  147. s := sv.String()
  148. f, _ := strconv.ParseFloat(s, 64)
  149. return f
  150. } else {
  151. return math.NaN()
  152. }
  153. }
  154. }
  155. // float64 to float64 去掉金额字符串后面的0
  156. func FloatToFloat(f float64) float64 {
  157. ff, _ := strconv.ParseFloat(FloatToStr3(f), 64)
  158. return ff
  159. }
  160. // string to Float
  161. func StrToFloat4(str string) any {
  162. if strings.Contains(str, `*`) {
  163. return str
  164. } else {
  165. if strings.Contains(str, `%`) {
  166. str = strings.ReplaceAll(str, `%`, ``)
  167. str = TrimQff(str)
  168. intValue, err := strconv.ParseFloat(str, 64)
  169. if err != nil {
  170. intValue = 0
  171. }
  172. d := decimal.NewFromFloat(intValue)
  173. //zaplog.LoggerS.Info(n.String())
  174. f, _ := d.Round(2).Float64()
  175. return f / 100
  176. } else {
  177. str = TrimQff(str)
  178. intValue, err := strconv.ParseFloat(str, 64)
  179. if err != nil {
  180. intValue = 0
  181. }
  182. d := decimal.NewFromFloat(intValue)
  183. //zaplog.LoggerS.Info(n.String())
  184. f, _ := d.Round(2).Float64()
  185. return f
  186. }
  187. }
  188. }
  189. // float64 to string 去掉金额字符串后面的0
  190. func FloatToStr3(f float64) string {
  191. ss := strconv.FormatFloat(f, 'f', 2, 64)
  192. return doDecimal(ss)
  193. }
  194. func doDecimal(s string) string {
  195. if strings.Index(s, ".") < 0 {
  196. return s
  197. }
  198. l := len(s)
  199. if strings.HasSuffix(s, "0") {
  200. return doDecimal(s[0 : l-1])
  201. }
  202. if strings.HasSuffix(s, ".") {
  203. return doDecimal(s[0 : l-1])
  204. }
  205. return s
  206. }
  207. func FloatToFloat2(f float64) float64 {
  208. fstr := fmt.Sprintf("%0.2f", f)
  209. return StrToFloat(fstr)
  210. }
  211. // DecimalAddSS 精确相加 字符串
  212. func DecimalAddFS(v1 float64, v2 string) float64 {
  213. v2 = AmountFormat2str(v2)
  214. r := DecimalAddFF(v1, StrToFloat(v2))
  215. return r
  216. }
  217. // string to Float
  218. func AmountFormat2str(str string) string {
  219. return strings.TrimSpace(strings.ReplaceAll(str, ",", ""))
  220. }
  221. func StrToFloToStr(str string) string {
  222. sflo := StrToFloat(str)
  223. str = FloatToStr(sflo)
  224. return str
  225. }
  226. // 获取input的值
  227. func GetInputValue(p *rod.Page, xPath string) string {
  228. str := MustElementX(p, xPath).MustEval(`()=>{return this.value}`).Str()
  229. return strings.ReplaceAll(str, ",", "")
  230. }
  231. func FloatToStrN(f float64, lens ...int) string {
  232. if f == 0 {
  233. return ""
  234. }
  235. lenth := 2
  236. if len(lens) == 1 {
  237. lenth = lens[0]
  238. }
  239. str := strconv.FormatFloat(f, 'f', lenth, 64)
  240. if str == "-0.000" || str == "-0.00" || str == "-0.0" || str == "-0" {
  241. str = ""
  242. }
  243. return str
  244. }
  245. // FormatFloat 主要逻辑就是先乘,trunc之后再除回去,就达到了保留N位小数的效果
  246. func FormatFloat(num float64, decimal int) string {
  247. // 默认乘1
  248. d := float64(1)
  249. if decimal > 0 {
  250. // 10的N次方
  251. d = math.Pow10(decimal)
  252. }
  253. // math.trunc作用就是返回浮点数的整数部分
  254. // 再除回去,小数点后无效的0也就不存在了
  255. return strconv.FormatFloat(math.Trunc(num*d)/d, 'f', -1, 64)
  256. }
  257. func DecimalDivSS(v1 string, v2 string) float64 {
  258. v1 = AmountFormat2str(v1)
  259. v2 = AmountFormat2str(v2)
  260. r := DecimalDivFF(StrToFloat(v1), StrToFloat(v2))
  261. return r
  262. }
  263. func DecimalAddSS(v1 string, v2 string) float64 {
  264. v1 = AmountFormat2str(v1)
  265. v2 = AmountFormat2str(v2)
  266. r := DecimalAddFF(StrToFloat(v1), StrToFloat(v2))
  267. return r
  268. }
  269. // string to uint
  270. func StrToUint(str string) uint {
  271. intValue, _ := strconv.Atoi(str)
  272. return uint(intValue)
  273. }
  274. func FloatToStr4(f float64, len int) string {
  275. // 如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数
  276. // 如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分)
  277. //func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  278. //f := 100.12345678901234567890123456789
  279. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'f', 5, 64))
  280. // 100.12346
  281. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'g', 5, 64))
  282. // 100.12
  283. //zaplog.LoggerS.Info(strconv.FormatFloat(f, 'G', 5, 64))
  284. // 100.12
  285. return strconv.FormatFloat(f, 'f', len, 64)
  286. }
  287. // string to Float
  288. func AmountFormat(str string) float64 {
  289. return StrToFloatAll(strings.TrimSpace(strings.ReplaceAll(str, ",", "")))
  290. }