c_time.go 4.0 KB

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