str.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. func IsDigitsOnly(s string) bool {
  16. matched, _ := regexp.MatchString(`^[0-9]+$`, s)
  17. return matched
  18. }
  19. // length 长度 生成一个由0-9 + 26个小写字母组成的指定长度字符串
  20. func RandStr(length int) string {
  21. 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"}
  22. ranChr := ""
  23. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  24. //rand.Seed(time.Now().Unix())
  25. for j := 0; j < length; j++ {
  26. ranChr += digitCharacter[r.Intn(len(digitCharacter))]
  27. }
  28. return strings.ToUpper(ranChr)
  29. }
  30. func Md5Encode(data string) string {
  31. h := md5.New()
  32. h.Write([]byte(data))
  33. return hex.EncodeToString(h.Sum(nil))
  34. }
  35. func Md5ByteEncode(data []byte) string {
  36. h := md5.New()
  37. h.Write(data)
  38. return hex.EncodeToString(h.Sum(nil))
  39. }
  40. func Md5JsonEncode(any interface{}) string {
  41. h := md5.New()
  42. data, _ := json.Marshal(any)
  43. h.Write(data)
  44. return hex.EncodeToString(h.Sum(nil))
  45. }
  46. // 安全码检查
  47. func CheckSafePasswordLever6(ps string) error {
  48. if len(ps) != 6 {
  49. return fmt.Errorf("password len must be 6")
  50. }
  51. pattern := `^[0-9]{6}$` // 必须为数字
  52. reg := regexp.MustCompile(pattern)
  53. if !reg.MatchString(ps) {
  54. return fmt.Errorf("password must be nums")
  55. }
  56. return nil
  57. }
  58. // 反转切片
  59. func ReverseSlice[T any](s []T) {
  60. for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
  61. s[i], s[j] = s[j], s[i]
  62. }
  63. }
  64. func HideEthAddress(address string) string {
  65. if len(address) <= 10 { // 0x + 8 chars
  66. return address
  67. }
  68. if !strings.HasPrefix(address, "0x") {
  69. address = "0x" + address
  70. }
  71. return address[:4] + "..." + address[len(address)-4:]
  72. }
  73. func HideMiddle(str string, keepStart, keepEnd int) string {
  74. if len(str) <= keepStart+keepEnd {
  75. return str // 字符串太短则不处理
  76. }
  77. // 获取前后部分
  78. start := str[:keepStart]
  79. end := str[len(str)-keepEnd:]
  80. // 生成中间*部分
  81. stars := strings.Repeat("*", len(str)-keepStart-keepEnd)
  82. return start + stars + end
  83. }
  84. func DecimalFmtWithText2(d decimal.Decimal) string {
  85. p := message.NewPrinter(language.English)
  86. f, _ := d.Float64()
  87. return p.Sprintf("%.2f", f)
  88. }
  89. // 单词变化为蛇形
  90. func VarToSnakeCase(s string) string {
  91. // 在大写字母前添加下划线,并将所有非字母数字字符替换为下划线
  92. matchFirstCap := regexp.MustCompile("(.)([A-Z][a-z]+)")
  93. matchAllCap := regexp.MustCompile("([a-z0-9])([A-Z])")
  94. snake := matchFirstCap.ReplaceAllString(s, "${1}_${2}")
  95. snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}")
  96. snake = strings.ToLower(snake)
  97. // 移除连续的下划线和非字母数字字符
  98. reg := regexp.MustCompile("[^a-z0-9]+")
  99. snake = reg.ReplaceAllString(snake, "_")
  100. snake = strings.Trim(snake, "_")
  101. return snake
  102. }
  103. func WordsToSnakeCase(s string) string {
  104. strsOne := strings.Split(s, ",")
  105. handOne := make([]string, 0)
  106. for _, item := range strsOne {
  107. newStrs := make([]string, 0)
  108. strs := strings.Split(item, " ")
  109. for _, str := range strs {
  110. newStrs = append(newStrs, VarToSnakeCase(str))
  111. }
  112. handOne = append(handOne, strings.Join(newStrs, " "))
  113. }
  114. return strings.Join(handOne, ",")
  115. }