-
Notifications
You must be signed in to change notification settings - Fork 1
/
string.go
164 lines (148 loc) · 3.22 KB
/
string.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package gotools
import (
"strconv"
"strings"
"unicode"
"github.com/joker-circus/gotools/internal"
)
func LowerSlice(values ...string) []string {
n := make([]string, len(values))
for i, v := range values {
n[i] = strings.ToLower(v)
}
return n
}
func InSlice(s []string, val string) bool {
for _, v := range s {
if v == val {
return true
}
}
return false
}
// 判断字符串是不是 true
func IsTrueString(str string) bool {
return strings.ToLower(str) == "true"
}
func HumanUnit(l uint64) string {
var (
suffix string
size float64
)
if l >= (1 << 30) {
suffix = "G"
size = float64(l) / (1 << 30)
} else if l >= (1 << 20) {
suffix = "M"
size = float64(l) / (1 << 20)
} else if l >= (1 << 10) {
suffix = "K"
size = float64(l) / (1 << 10)
} else {
size = float64(l)
suffix = "B"
}
return strconv.FormatFloat(size, 'f', 3, 64) + suffix
}
// 首字母大写
func Ucfirst(str string) string {
for i, v := range str {
return string(unicode.ToUpper(v)) + str[i+1:]
}
return ""
}
// 首字母小写
func Lcfirst(str string) string {
for i, v := range str {
return string(unicode.ToLower(v)) + str[i+1:]
}
return ""
}
// 驼峰写法。下划线写法转为驼峰写法。
//
// 例如:xx_yy to XxYx xx_y_y to XxYY。
//
// 等同于:
//
// s = strings.Replace(s, "_", " ", -1)
// s = strings.Title(s)
// return strings.Replace(s, " ", "", -1)
func CamelCase(s string) string {
data := make([]byte, 0, len(s))
j := false
k := false
num := len(s) - 1
for i := 0; i <= num; i++ {
d := s[i]
if k == false && d >= 'A' && d <= 'Z' {
k = true
}
if d >= 'a' && d <= 'z' && (j || k == false) {
d = d - 32
j = false
k = true
}
if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
j = true
continue
}
data = append(data, d)
}
return string(data[:])
}
// 蛇形/下划线写法。驼峰式写法转为下划线写法。
//
// 例如:XxYy to xx_yy , XxYY to xx_y_y。
func SnakeCase(s string) string {
data := make([]byte, 0, len(s)*2)
j := false
num := len(s)
for i := 0; i < num; i++ {
d := s[i]
// or通过ASCII码进行大小写的转化
// 65-90(A-Z),97-122(a-z)
//判断如果字母为大写的A-Z就在前面拼接一个_
if i > 0 && d >= 'A' && d <= 'Z' && j {
data = append(data, '_')
}
if d != '_' {
j = true
}
data = append(data, d)
}
//ToLower把大写字母统一转小写
return strings.ToLower(string(data[:]))
}
// Domain get the domain of given URL
func Domain(url string) string {
domainPattern := `([a-z0-9][-a-z0-9]{0,62})\.` +
`(com\.cn|com\.hk|` +
`cn|com|net|edu|gov|biz|org|info|pro|name|xxx|xyz|be|` +
`me|top|cc|tv|tt)`
domain := internal.MatchOneOf(url, domainPattern)
if domain != nil {
return domain[1]
}
return ""
}
// LimitLength Handle overly long strings
func LimitLength(s string, length int) string {
// 0 means unlimited
if length == 0 {
return s
}
const ELLIPSES = "..."
str := []rune(s)
if len(str) > length {
return string(str[:length-len(ELLIPSES)]) + ELLIPSES
}
return s
}
// Reverse Reverse a string
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}