str.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package utils
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/shopspring/decimal"
  8. "golang.org/x/text/language"
  9. "golang.org/x/text/message"
  10. "math/rand"
  11. "regexp"
  12. "strings"
  13. "time"
  14. )
  15. // length 长度 生成一个由0-9 + 26个小写字母组成的指定长度字符串
  16. func RandStr(length int) string {
  17. digitCharacter := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
  18. ranChr := ""
  19. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  20. //rand.Seed(time.Now().Unix())
  21. for j := 0; j < length; j++ {
  22. ranChr += digitCharacter[r.Intn(len(digitCharacter))]
  23. }
  24. return strings.ToUpper(ranChr)
  25. }
  26. func DecimalFmtWithText(d decimal.Decimal) string {
  27. p := message.NewPrinter(language.English)
  28. f, _ := d.Float64()
  29. return p.Sprintf("%.2f", f)
  30. }
  31. func Md5Encode(data string) string {
  32. h := md5.New()
  33. h.Write([]byte(data))
  34. return hex.EncodeToString(h.Sum(nil))
  35. }
  36. func Md5ByteEncode(data []byte) string {
  37. h := md5.New()
  38. h.Write(data)
  39. return hex.EncodeToString(h.Sum(nil))
  40. }
  41. func Md5JsonEncode(any interface{}) string {
  42. h := md5.New()
  43. data, _ := json.Marshal(any)
  44. h.Write(data)
  45. return hex.EncodeToString(h.Sum(nil))
  46. }
  47. // 安全码检查
  48. func CheckSafePasswordLever6(ps string) error {
  49. if len(ps) != 6 {
  50. return fmt.Errorf("password len must be 6")
  51. }
  52. pattern := `^[0-9]{6}$` // 必须为数字
  53. reg := regexp.MustCompile(pattern)
  54. if !reg.MatchString(ps) {
  55. return fmt.Errorf("password must be nums")
  56. }
  57. return nil
  58. }
  59. // 单词变化为蛇形
  60. func VarToSnakeCase(s string) string {
  61. // 在大写字母前添加下划线,并将所有非字母数字字符替换为下划线
  62. matchFirstCap := regexp.MustCompile("(.)([A-Z][a-z]+)")
  63. matchAllCap := regexp.MustCompile("([a-z0-9])([A-Z])")
  64. snake := matchFirstCap.ReplaceAllString(s, "${1}_${2}")
  65. snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
  66. snake = strings.ToLower(snake)
  67. // 移除连续的下划线和非字母数字字符
  68. reg := regexp.MustCompile("[^a-z0-9]+")
  69. snake = reg.ReplaceAllString(snake, "_")
  70. snake = strings.Trim(snake, "_")
  71. return snake
  72. }
  73. func WordsToSnakeCase(s string) string {
  74. strsOne := strings.Split(s, ",")
  75. handOne := make([]string, 0)
  76. for _, item := range strsOne {
  77. newStrs := make([]string, 0)
  78. strs := strings.Split(strings.TrimSpace(item), " ")
  79. for _, str := range strs {
  80. str = strings.TrimSpace(str)
  81. if str == "" {
  82. continue
  83. }
  84. // 检查是否是排序关键字(asc/desc)
  85. strLower := strings.ToLower(str)
  86. if strLower == "asc" || strLower == "desc" {
  87. newStrs = append(newStrs, strLower)
  88. } else {
  89. // 移除可能存在的反引号,然后转换为蛇形命名,最后添加反引号
  90. str = strings.Trim(str, "`")
  91. snake := VarToSnakeCase(str)
  92. newStrs = append(newStrs, "`"+snake+"`")
  93. }
  94. }
  95. handOne = append(handOne, strings.Join(newStrs, " "))
  96. }
  97. return strings.Join(handOne, ", ")
  98. }