c_time.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package clean
  2. import (
  3. "github.com/shopspring/decimal"
  4. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  5. "regexp"
  6. "strings"
  7. )
  8. var numReg = regexp.MustCompile("[0-9.]+")
  9. var symbolReg = regexp.MustCompile("[%%﹪!!]")
  10. var YMD_Reg1 = regexp.MustCompile("(\\d{4}年\\d{1,2}月\\d{1,2}日)")
  11. var YMD_Reg2 = regexp.MustCompile("(\\d{4}[-]\\d{1,2}[-]\\d{1,2})")
  12. var HMS_Reg1 = regexp.MustCompile("(\\d{1,2}时\\d{1,2}分\\d{1,2}秒)")
  13. var HMS_Reg2 = regexp.MustCompile("(\\d{1,2}[:]\\d{1,2}[:]\\d{1,2})")
  14. func fillPrefix(s string) string {
  15. if len(s) == 2 {
  16. return s
  17. } else if len(s) == 1 {
  18. return "0" + s
  19. } else {
  20. return "00"
  21. }
  22. }
  23. // 获取年月日
  24. func convertYMD(ymd string) string {
  25. if ymd1 := YMD_Reg1.FindString(ymd); ymd1 != "" {
  26. ymd1 = strings.ReplaceAll(ymd1, "年", "-")
  27. ymd1 = strings.ReplaceAll(ymd1, "月", "-")
  28. ymd1 = strings.ReplaceAll(ymd1, "日", "")
  29. if arr := strings.Split(ymd1, "-"); len(arr) == 3 {
  30. y, m, d := arr[0], arr[1], arr[2]
  31. return y + "-" + fillPrefix(m) + "-" + fillPrefix(d)
  32. } else {
  33. return ""
  34. }
  35. }
  36. if ymd2 := YMD_Reg2.FindString(ymd); ymd2 != "" {
  37. if arr := strings.Split(ymd2, "-"); len(arr) == 3 {
  38. y, m, d := arr[0], arr[1], arr[2]
  39. return y + "-" + fillPrefix(m) + "-" + fillPrefix(d)
  40. } else {
  41. return ""
  42. }
  43. }
  44. return ""
  45. }
  46. // 获取时分秒
  47. func convertHMS(hms string) string {
  48. if hms1 := HMS_Reg1.FindString(hms); hms1 != "" {
  49. hms1 = strings.ReplaceAll(hms1, "时", ":")
  50. hms1 = strings.ReplaceAll(hms1, "分", ":")
  51. hms1 = strings.ReplaceAll(hms1, "秒", "")
  52. if arr := strings.Split(hms1, ":"); len(arr) == 3 {
  53. h, m, s := arr[0], arr[1], arr[2]
  54. return fillPrefix(h) + ":" + fillPrefix(m) + ":" + fillPrefix(s)
  55. } else {
  56. return "00:00:00"
  57. }
  58. }
  59. if hms2 := HMS_Reg2.FindString(hms); hms2 != "" {
  60. arr := strings.Split(hms2, ":")
  61. h, m, s := "", "", ""
  62. if len(arr) == 3 {
  63. h, m, s = arr[0], arr[1], arr[2]
  64. } else if len(arr) == 2 {
  65. h, m, s = arr[0], arr[1], "00"
  66. } else {
  67. return "00:00:00"
  68. }
  69. return fillPrefix(h) + ":" + fillPrefix(m) + ":" + fillPrefix(s)
  70. }
  71. return "00:00:00"
  72. }
  73. // 清洗时间
  74. func CleanTime(st string) string {
  75. if st == "" || st == "无" {
  76. return ""
  77. }
  78. st = strings.ReplaceAll(st, ":", ":")
  79. ymd, hms := convertYMD(st), convertHMS(st)
  80. if ymd == "" {
  81. return ""
  82. }
  83. st = ymd + " " + hms
  84. return st
  85. //t, _ := time.ParseInLocation(ul.TimeLayout, st, time.Local)
  86. //return t.Unix()
  87. }
  88. // 清洗折扣率
  89. func CleanDiscount(str string) float64 {
  90. str = fieldReg1.ReplaceAllString(str, "")
  91. if str == "" || str == "无" {
  92. return 0.0
  93. }
  94. if biddiscount := RateToFloat(str); biddiscount > 0.0 {
  95. baseCount := 1.0
  96. num1 := decimal.NewFromFloat(baseCount)
  97. num2 := decimal.NewFromFloat(biddiscount)
  98. if strings.Contains(str, "上浮") {
  99. decimalValue := num1.Add(num2)
  100. res, _ := decimalValue.Float64()
  101. return res
  102. } else if strings.Contains(str, "下浮") {
  103. decimalValue := num1.Sub(num2)
  104. res, _ := decimalValue.Float64()
  105. return res
  106. } else {
  107. return biddiscount
  108. }
  109. }
  110. return 0.0
  111. }
  112. // 转换系数
  113. func RateToFloat(str string) float64 {
  114. if num0 := qu.Float64All(numReg.FindString(str)); num0 > 0.0 {
  115. num1 := decimal.NewFromFloat(100.0)
  116. num2 := decimal.NewFromFloat(num0)
  117. if symbolReg.MatchString(str) {
  118. decimalValue := num2.Div(num1)
  119. res, _ := decimalValue.Float64()
  120. if res < 1.0 {
  121. return res
  122. } else {
  123. return 0.0
  124. }
  125. } else {
  126. if num0 < 1.0 {
  127. return num0
  128. } else if num0 == 1 {
  129. return 0.0
  130. } else {
  131. decimalValue := num2.Div(num1)
  132. res, _ := decimalValue.Float64()
  133. if res < 1.0 {
  134. return res
  135. } else {
  136. return 0.0
  137. }
  138. }
  139. }
  140. }
  141. return 0.0
  142. }