c_time.go 3.6 KB

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