package helper import ( "math/big" "strconv" "strings" "unicode" "unsafe" ) type Str struct { value string } func NewStr(value string) *Str { return &Str{value: value} } //设置字符 func (s *Str) Set(v string) *Str { if v != "" { s.value = v } else { s.Clear() } return s } //将一个一维切片的值转化为字符串 func (s *Str) Join(glue string, pieces []string) *Str { s.value = NewSlice().Implode(glue, pieces) return s } //移除字符串两侧的空白字符或其他预定义字符 func (s *Str) Trim(characterMask ...string) *Str { if len(characterMask) == 0 { s.value = strings.TrimSpace(s.value) } else { s.value = strings.Trim(s.value, characterMask[0]) } return s } //移除字符串左侧的空白字符或其他预定义字符 func (s *Str) Ltrim(characterMask ...string) *Str { if len(characterMask) == 0 { s.value = strings.TrimLeftFunc(s.value, unicode.IsSpace) } else { s.value = strings.TrimLeft(s.value, characterMask[0]) } return s } //移除字符串右侧的空白字符或其他预定义字符 func (s *Str) Rtrim(characterMask ...string) *Str { if len(characterMask) == 0 { s.value = strings.TrimRightFunc(s.value, unicode.IsSpace) } else { s.value = strings.TrimRight(s.value, characterMask[0]) } return s } //小写字母转大写 func (s *Str) Upper() *Str { s.value = strings.ToUpper(s.value) return s } //大写字母转小写 func (s *Str) Lower() *Str { s.value = strings.ToLower(s.value) return s } //首字符转换为大写 func (s *Str) Ucfirst() *Str { for _, v := range s.value { u := string(unicode.ToUpper(v)) s.value = u + s.value[len(u):] } return s } //首字符转换为小写 func (s *Str) Lcfirst() *Str { for _, v := range s.value { u := string(unicode.ToLower(v)) s.value = u + s.value[len(u):] } return s } //每个单词的首字符转换为大写 func (s *Str) Ucwords() *Str { s.value = strings.Title(s.value) return s } //查找字符串在另一字符串中第一次出现的位置 对大小写敏感 func (s *Str) Strpos(needle string, offset int) int { length := len(s.value) if length == 0 || offset > length || -offset > length { return -1 } if offset < 0 { offset += length } pos := strings.Index(s.value[offset:], needle) if pos == -1 { return -1 } return pos + offset } //查找字符串在另一字符串中第一次出现的位置(不区分大小写) func (s *Str) Stripos(needle string, offset int) int { length := len(s.value) if length == 0 || offset > length || -offset > length { return -1 } haystack := s.value[offset:] if offset < 0 { offset += length } pos := strings.Index(strings.ToLower(haystack), strings.ToLower(needle)) if pos == -1 { return -1 } return pos + offset } //查找字符串在另一字符串中最后一次出现的位置(区分大小写) func (s *Str) Strrpos(needle string, offset int) int { pos, length := 0, len(s.value) if length == 0 || offset > length || -offset > length { return -1 } var haystack string if offset < 0 { haystack = s.value[:offset+length+1] } else { haystack = s.value[offset:] } pos = strings.LastIndex(haystack, needle) if offset > 0 && pos != -1 { pos += offset } return pos } //查找字符串在另一字符串中最后一次出现的位置(不区分大小写) func (s *Str) Strripos(needle string, offset int) int { pos, length := 0, len(s.value) if length == 0 || offset > length || -offset > length { return -1 } var haystack string if offset < 0 { haystack = s.value[:offset+length+1] } else { haystack = s.value[offset:] } pos = strings.LastIndex(strings.ToLower(haystack), strings.ToLower(needle)) if offset > 0 && pos != -1 { pos += offset } return pos } //字母下划线命名转换驼峰命名 func (s *Str) Camel() *Str { data := make([]byte, 0, len(s.value)) flag, num := true, len(s.value)-1 for i := 0; i <= num; i++ { d := s.value[i] if d == '_' { flag = true continue } else if flag { if d >= 'a' && d <= 'z' { d = d - 32 } flag = false } data = append(data, d) } s.value = string(data[:]) return s } //字母驼峰命名转换为下划线命名 func (s *Str) Snake() *Str { num := len(s.value) data := make([]byte, 0, num*2) j := false for i := 0; i < num; i++ { d := s.value[i] if i > 0 && d >= 'A' && d <= 'Z' && j { data = append(data, '_') } if d != '_' { j = true } data = append(data, d) } s.value = string(data[:]) return s.Lower() } //将字符串转换为切片 func (s *Str) ToBytes() []byte { return *(*[]byte)(unsafe.Pointer( &struct { string Cap int }{s.value, len(s.value)}, )) } //转换为Bool func (s *Str) ToBool() bool { if b, err := strconv.ParseBool(s.String()); err == nil { return b } return false } //转换为float32 func (s *Str) ToFloat32() float32 { if v, err := strconv.ParseFloat(s.String(), 32); err == nil { return float32(v) } return 0 } //转换为float64 func (s *Str) ToFloat64() float64 { if f, err := strconv.ParseFloat(s.String(), 64); err == nil { return f } return 0 } //转换为int func (s *Str) ToInt() int { if i, err := strconv.ParseInt(s.String(), 10, 32); err == nil { return int(i) } return 0 } //转换为int8 func (s *Str) ToInt8() int8 { if i, err := strconv.ParseInt(s.String(), 10, 8); err == nil { return int8(i) } return 0 } //转换为int16 func (s *Str) ToInt16() int16 { if i, err := strconv.ParseInt(s.String(), 10, 16); err == nil { return int16(i) } return 0 } //转换为int32 func (s *Str) ToInt32() int32 { if i, err := strconv.ParseInt(s.String(), 10, 32); err == nil { return int32(i) } return 0 } //转换为int64 func (s *Str) ToInt64() int64 { v, err := strconv.ParseInt(s.String(), 10, 64) if err != nil { i := new(big.Int) ni, ok := i.SetString(s.String(), 10) if !ok { return 0 } return ni.Int64() } return v } //转换为uint func (s *Str) ToUint() uint { if i, err := strconv.ParseUint(s.String(), 10, 32); err == nil { return uint(i) } return 0 } //转换为uint8 func (s *Str) ToUint8() uint8 { if i, err := strconv.ParseUint(s.String(), 10, 8); err == nil { return uint8(i) } return 0 } //转换为uint16 func (s *Str) ToUint16() uint16 { if i, err := strconv.ParseUint(s.String(), 10, 16); err == nil { return uint16(i) } return 0 } //转换为uint32 func (s *Str) ToUint32() uint32 { if i, err := strconv.ParseUint(s.String(), 10, 32); err == nil { return uint32(i) } return 0 } //Md5 func (s *Str) ToMd5() *HashData { return NewHash([]byte(s.value)).Md5() } //Sha1 func (s *Str) ToSha1() *HashData { return NewHash([]byte(s.value)).Sha1() } //Sha256 func (s *Str) ToSha256() *HashData { return NewHash([]byte(s.value)).Sha256() } //Sha512 func (s *Str) ToSha512() *HashData { return NewHash([]byte(s.value)).Sha512() } //转换为uint64 func (s *Str) ToUint64() uint64 { v, err := strconv.ParseUint(s.String(), 10, 64) if err != nil { i := new(big.Int) ni, ok := i.SetString(s.String(), 10) if !ok { return 0 } return ni.Uint64() } return v } //判断后缀 func (s *Str) HasSuffix(suffix string) bool { return strings.HasSuffix(s.value, suffix) } //判断前缀 func (s *Str) HasPrefix(prefix string) bool { return strings.HasSuffix(s.value, prefix) } //字符串分割 func (s *Str) Explode(delimiter string) []string { return strings.Split(s.value, delimiter) } func (s *Str) String() string { if s.Exist() { return s.value } return "" } //清除字符串 func (s *Str) Clear() { s.Set(string(0x1E)) } //检查字符串是否存在 func (s *Str) Exist() bool { return s.value != string(0x1E) } //字符串组是否包含某字符串 func StringsContains(array []string, val string) (index int) { index = -1 for i := 0; i < len(array); i++ { if array[i] == val { index = i return index } } return index }