str.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package helper
  2. import (
  3. "math/big"
  4. "strconv"
  5. "strings"
  6. "unicode"
  7. "unsafe"
  8. )
  9. type Str struct {
  10. value string
  11. }
  12. func NewStr(value string) *Str {
  13. return &Str{value: value}
  14. }
  15. //设置字符
  16. func (s *Str) Set(v string) *Str {
  17. if v != "" {
  18. s.value = v
  19. } else {
  20. s.Clear()
  21. }
  22. return s
  23. }
  24. //将一个一维切片的值转化为字符串
  25. func (s *Str) Join(glue string, pieces []string) *Str {
  26. s.value = NewSlice().Implode(glue, pieces)
  27. return s
  28. }
  29. //移除字符串两侧的空白字符或其他预定义字符
  30. func (s *Str) Trim(characterMask ...string) *Str {
  31. if len(characterMask) == 0 {
  32. s.value = strings.TrimSpace(s.value)
  33. } else {
  34. s.value = strings.Trim(s.value, characterMask[0])
  35. }
  36. return s
  37. }
  38. //移除字符串左侧的空白字符或其他预定义字符
  39. func (s *Str) Ltrim(characterMask ...string) *Str {
  40. if len(characterMask) == 0 {
  41. s.value = strings.TrimLeftFunc(s.value, unicode.IsSpace)
  42. } else {
  43. s.value = strings.TrimLeft(s.value, characterMask[0])
  44. }
  45. return s
  46. }
  47. //移除字符串右侧的空白字符或其他预定义字符
  48. func (s *Str) Rtrim(characterMask ...string) *Str {
  49. if len(characterMask) == 0 {
  50. s.value = strings.TrimRightFunc(s.value, unicode.IsSpace)
  51. } else {
  52. s.value = strings.TrimRight(s.value, characterMask[0])
  53. }
  54. return s
  55. }
  56. //小写字母转大写
  57. func (s *Str) Upper() *Str {
  58. s.value = strings.ToUpper(s.value)
  59. return s
  60. }
  61. //大写字母转小写
  62. func (s *Str) Lower() *Str {
  63. s.value = strings.ToLower(s.value)
  64. return s
  65. }
  66. //首字符转换为大写
  67. func (s *Str) Ucfirst() *Str {
  68. for _, v := range s.value {
  69. u := string(unicode.ToUpper(v))
  70. s.value = u + s.value[len(u):]
  71. }
  72. return s
  73. }
  74. //首字符转换为小写
  75. func (s *Str) Lcfirst() *Str {
  76. for _, v := range s.value {
  77. u := string(unicode.ToLower(v))
  78. s.value = u + s.value[len(u):]
  79. }
  80. return s
  81. }
  82. //每个单词的首字符转换为大写
  83. func (s *Str) Ucwords() *Str {
  84. s.value = strings.Title(s.value)
  85. return s
  86. }
  87. //查找字符串在另一字符串中第一次出现的位置 对大小写敏感
  88. func (s *Str) Strpos(needle string, offset int) int {
  89. length := len(s.value)
  90. if length == 0 || offset > length || -offset > length {
  91. return -1
  92. }
  93. if offset < 0 {
  94. offset += length
  95. }
  96. pos := strings.Index(s.value[offset:], needle)
  97. if pos == -1 {
  98. return -1
  99. }
  100. return pos + offset
  101. }
  102. //查找字符串在另一字符串中第一次出现的位置(不区分大小写)
  103. func (s *Str) Stripos(needle string, offset int) int {
  104. length := len(s.value)
  105. if length == 0 || offset > length || -offset > length {
  106. return -1
  107. }
  108. haystack := s.value[offset:]
  109. if offset < 0 {
  110. offset += length
  111. }
  112. pos := strings.Index(strings.ToLower(haystack), strings.ToLower(needle))
  113. if pos == -1 {
  114. return -1
  115. }
  116. return pos + offset
  117. }
  118. //查找字符串在另一字符串中最后一次出现的位置(区分大小写)
  119. func (s *Str) Strrpos(needle string, offset int) int {
  120. pos, length := 0, len(s.value)
  121. if length == 0 || offset > length || -offset > length {
  122. return -1
  123. }
  124. var haystack string
  125. if offset < 0 {
  126. haystack = s.value[:offset+length+1]
  127. } else {
  128. haystack = s.value[offset:]
  129. }
  130. pos = strings.LastIndex(haystack, needle)
  131. if offset > 0 && pos != -1 {
  132. pos += offset
  133. }
  134. return pos
  135. }
  136. //查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
  137. func (s *Str) Strripos(needle string, offset int) int {
  138. pos, length := 0, len(s.value)
  139. if length == 0 || offset > length || -offset > length {
  140. return -1
  141. }
  142. var haystack string
  143. if offset < 0 {
  144. haystack = s.value[:offset+length+1]
  145. } else {
  146. haystack = s.value[offset:]
  147. }
  148. pos = strings.LastIndex(strings.ToLower(haystack), strings.ToLower(needle))
  149. if offset > 0 && pos != -1 {
  150. pos += offset
  151. }
  152. return pos
  153. }
  154. //字母下划线命名转换驼峰命名
  155. func (s *Str) Camel() *Str {
  156. data := make([]byte, 0, len(s.value))
  157. flag, num := true, len(s.value)-1
  158. for i := 0; i <= num; i++ {
  159. d := s.value[i]
  160. if d == '_' {
  161. flag = true
  162. continue
  163. } else if flag {
  164. if d >= 'a' && d <= 'z' {
  165. d = d - 32
  166. }
  167. flag = false
  168. }
  169. data = append(data, d)
  170. }
  171. s.value = string(data[:])
  172. return s
  173. }
  174. //字母驼峰命名转换为下划线命名
  175. func (s *Str) Snake() *Str {
  176. num := len(s.value)
  177. data := make([]byte, 0, num*2)
  178. j := false
  179. for i := 0; i < num; i++ {
  180. d := s.value[i]
  181. if i > 0 && d >= 'A' && d <= 'Z' && j {
  182. data = append(data, '_')
  183. }
  184. if d != '_' {
  185. j = true
  186. }
  187. data = append(data, d)
  188. }
  189. s.value = string(data[:])
  190. return s.Lower()
  191. }
  192. //将字符串转换为切片
  193. func (s *Str) ToBytes() []byte {
  194. return *(*[]byte)(unsafe.Pointer(
  195. &struct {
  196. string
  197. Cap int
  198. }{s.value, len(s.value)},
  199. ))
  200. }
  201. //转换为Bool
  202. func (s *Str) ToBool() bool {
  203. if b, err := strconv.ParseBool(s.String()); err == nil {
  204. return b
  205. }
  206. return false
  207. }
  208. //转换为float32
  209. func (s *Str) ToFloat32() float32 {
  210. if v, err := strconv.ParseFloat(s.String(), 32); err == nil {
  211. return float32(v)
  212. }
  213. return 0
  214. }
  215. //转换为float64
  216. func (s *Str) ToFloat64() float64 {
  217. if f, err := strconv.ParseFloat(s.String(), 64); err == nil {
  218. return f
  219. }
  220. return 0
  221. }
  222. //转换为int
  223. func (s *Str) ToInt() int {
  224. if i, err := strconv.ParseInt(s.String(), 10, 32); err == nil {
  225. return int(i)
  226. }
  227. return 0
  228. }
  229. //转换为int8
  230. func (s *Str) ToInt8() int8 {
  231. if i, err := strconv.ParseInt(s.String(), 10, 8); err == nil {
  232. return int8(i)
  233. }
  234. return 0
  235. }
  236. //转换为int16
  237. func (s *Str) ToInt16() int16 {
  238. if i, err := strconv.ParseInt(s.String(), 10, 16); err == nil {
  239. return int16(i)
  240. }
  241. return 0
  242. }
  243. //转换为int32
  244. func (s *Str) ToInt32() int32 {
  245. if i, err := strconv.ParseInt(s.String(), 10, 32); err == nil {
  246. return int32(i)
  247. }
  248. return 0
  249. }
  250. //转换为int64
  251. func (s *Str) ToInt64() int64 {
  252. v, err := strconv.ParseInt(s.String(), 10, 64)
  253. if err != nil {
  254. i := new(big.Int)
  255. ni, ok := i.SetString(s.String(), 10)
  256. if !ok {
  257. return 0
  258. }
  259. return ni.Int64()
  260. }
  261. return v
  262. }
  263. //转换为uint
  264. func (s *Str) ToUint() uint {
  265. if i, err := strconv.ParseUint(s.String(), 10, 32); err == nil {
  266. return uint(i)
  267. }
  268. return 0
  269. }
  270. //转换为uint8
  271. func (s *Str) ToUint8() uint8 {
  272. if i, err := strconv.ParseUint(s.String(), 10, 8); err == nil {
  273. return uint8(i)
  274. }
  275. return 0
  276. }
  277. //转换为uint16
  278. func (s *Str) ToUint16() uint16 {
  279. if i, err := strconv.ParseUint(s.String(), 10, 16); err == nil {
  280. return uint16(i)
  281. }
  282. return 0
  283. }
  284. //转换为uint32
  285. func (s *Str) ToUint32() uint32 {
  286. if i, err := strconv.ParseUint(s.String(), 10, 32); err == nil {
  287. return uint32(i)
  288. }
  289. return 0
  290. }
  291. //Md5
  292. func (s *Str) ToMd5() *HashData {
  293. return NewHash([]byte(s.value)).Md5()
  294. }
  295. //Sha1
  296. func (s *Str) ToSha1() *HashData {
  297. return NewHash([]byte(s.value)).Sha1()
  298. }
  299. //Sha256
  300. func (s *Str) ToSha256() *HashData {
  301. return NewHash([]byte(s.value)).Sha256()
  302. }
  303. //Sha512
  304. func (s *Str) ToSha512() *HashData {
  305. return NewHash([]byte(s.value)).Sha512()
  306. }
  307. //转换为uint64
  308. func (s *Str) ToUint64() uint64 {
  309. v, err := strconv.ParseUint(s.String(), 10, 64)
  310. if err != nil {
  311. i := new(big.Int)
  312. ni, ok := i.SetString(s.String(), 10)
  313. if !ok {
  314. return 0
  315. }
  316. return ni.Uint64()
  317. }
  318. return v
  319. }
  320. //判断后缀
  321. func (s *Str) HasSuffix(suffix string) bool {
  322. return strings.HasSuffix(s.value, suffix)
  323. }
  324. //判断前缀
  325. func (s *Str) HasPrefix(prefix string) bool {
  326. return strings.HasSuffix(s.value, prefix)
  327. }
  328. //字符串分割
  329. func (s *Str) Explode(delimiter string) []string {
  330. return strings.Split(s.value, delimiter)
  331. }
  332. func (s *Str) String() string {
  333. if s.Exist() {
  334. return s.value
  335. }
  336. return ""
  337. }
  338. //清除字符串
  339. func (s *Str) Clear() {
  340. s.Set(string(0x1E))
  341. }
  342. //检查字符串是否存在
  343. func (s *Str) Exist() bool {
  344. return s.value != string(0x1E)
  345. }
  346. //字符串组是否包含某字符串
  347. func StringsContains(array []string, val string) (index int) {
  348. index = -1
  349. for i := 0; i < len(array); i++ {
  350. if array[i] == val {
  351. index = i
  352. return index
  353. }
  354. }
  355. return index
  356. }