base_from_calculate.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package utils
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "sort"
  6. "strings"
  7. )
  8. // CheckFormula 检测计算公式是否异常
  9. func CheckFormula(formula string) map[string]string {
  10. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG", "LN", "EXP"}
  11. str := strings.ToUpper(formula)
  12. for _, v := range mathFormula {
  13. str = strings.Replace(str, v, "", -1)
  14. }
  15. str = strings.Replace(str, "(", "", -1)
  16. str = strings.Replace(str, ")", "", -1)
  17. byteMap := make(map[string]string)
  18. for i := 0; i < len(str); i++ {
  19. byteInt := str[i]
  20. if byteInt >= 65 && byteInt <= 90 {
  21. byteStr := string(byteInt)
  22. if _, ok := byteMap[byteStr]; !ok {
  23. byteMap[byteStr] = byteStr
  24. }
  25. }
  26. }
  27. return byteMap
  28. }
  29. type FormulaListItem struct {
  30. Formula string `json:"f"`
  31. Date string `json:"d"`
  32. }
  33. // HandleFormulaJson 处理计算公式json串是否异常
  34. func HandleFormulaJson(formula string, startDate string) (dateSlice []string, formulaMap map[string]string, err error) {
  35. list := make([]FormulaListItem, 0)
  36. err = json.Unmarshal([]byte(formula), &list)
  37. if err != nil {
  38. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  39. return
  40. }
  41. formulaMap = make(map[string]string)
  42. dateSlice = make([]string, 0)
  43. // 日期排序
  44. for k, v := range list {
  45. if k == 0 { // 首个日期均为起始日
  46. v.Date = startDate
  47. }
  48. formulaMap[v.Date] = v.Formula
  49. dateSlice = append(dateSlice, v.Date)
  50. }
  51. sort.Slice(dateSlice, func(i, j int) bool {
  52. return dateSlice[i] > dateSlice[j]
  53. })
  54. return
  55. }
  56. // CheckFormulaJson 检测计算公式json串是否异常
  57. func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
  58. list := make([]FormulaListItem, 0)
  59. err = json.Unmarshal([]byte(formula), &list)
  60. if err != nil {
  61. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  62. return
  63. }
  64. formulaSlice = make([]string, 0)
  65. // 日期排序
  66. for _, v := range list {
  67. formulaSlice = append(formulaSlice, v.Formula)
  68. }
  69. return
  70. }