github.com/JohanShen/go-utils@v1.1.4-0.20201117124024-901319a2b2a0/utils/str.go (about) 1 package utils 2 3 import ( 4 "hash/crc32" 5 "strings" 6 ) 7 8 // 获取字符串在字符串数组中的位置 9 // -1 表示字符串不在数组中 10 func IndexOf(ary []string, str string, isMatchCase bool) (index int) { 11 for i, v := range ary { 12 if v == str || (!isMatchCase && strings.ToUpper(v) == strings.ToUpper(str)) { 13 return i 14 } 15 } 16 return -1 17 } 18 19 // 获取字符串在字符串数组中的位置 20 // 区分大小写 21 // -1 表示字符串不在数组中 22 func IndexOfMatchCase(ary []string, str string) (index int) { 23 return IndexOf(ary, str, true) 24 } 25 26 // 获取字符串在字符串数组中的位置 27 // 不区分大小写 28 // -1 表示字符串不在数组中 29 func IndexOfWithoutCase(ary []string, str string) (index int) { 30 return IndexOf(ary, str, false) 31 } 32 33 // 向右靠齐固定字符长度 34 // 不支持中文 35 //func FixedRight(str string, s byte, l int) string { 36 // 37 // rs := string(s) 38 // smask := strings.Repeat(rs, l) 39 // if len(str)==0 { 40 // return smask 41 // } 42 // n := StringToBytes(smask) 43 // copy(n, str) 44 // return BytesToString(n) 45 // 46 //} 47 48 // 向左靠齐固定字符长度 49 // 一个中文算三位长度 50 //func FixedLeft(str string, s byte, l int) string { 51 // 52 // rs := string(s) 53 // if len(str)==0 { 54 // return strings.Repeat(rs, l) 55 // } 56 // r := l / len(str) 57 // if len(str)%l != 0 { 58 // r++ 59 // } 60 // n1 := StringToBytes(strings.Repeat(str, r)) 61 // if len(n1) > l { 62 // n1 = n1[len(n1)-l:] 63 // } 64 // left1 := l - len(str) 65 // if left1 > 0 { 66 // n2 := StringToBytes(strings.Repeat(rs, left1)) 67 // copy(n1, n2) 68 // } 69 // return BytesToString(n1) 70 // 71 //} 72 73 // 向右靠齐固定字符长度 74 func FixedRight(str string, s byte, l int) string { 75 76 rs := string(s) 77 smask := strings.Repeat(rs, l) 78 if len(str) == 0 { 79 return smask 80 } 81 n := StringToBytes(smask) 82 rstr := []rune(str) 83 //copy(n, str) 84 sb := strings.Builder{} 85 for i := 0; i < len(n); i++ { 86 if i >= len(rstr) { 87 sb.WriteByte(n[i]) 88 } else { 89 sb.WriteRune(rstr[i]) 90 } 91 } 92 return sb.String() 93 94 } 95 96 // 向左靠齐固定字符长度 97 func FixedLeft(str string, s byte, l int) string { 98 99 rs := string(s) 100 if len(str) == 0 { 101 return strings.Repeat(rs, l) 102 } 103 rstr := []rune(str) 104 r := l / len(rstr) 105 if len(rstr)%l != 0 { 106 r++ 107 } 108 n1 := StringToBytes(strings.Repeat(str, r)) 109 if len(n1) > l { 110 n1 = n1[len(n1)-l:] 111 } 112 left1 := l - len(rstr) 113 sb := strings.Builder{} 114 if left1 > 0 { 115 n2 := StringToBytes(strings.Repeat(rs, left1)) 116 //copy(n1, n2) 117 118 for i := 0; i < len(n1); i++ { 119 //fmt.Println(i, left1, l, len(rstr)) 120 if i >= left1 { 121 sb.WriteRune(rstr[i-len(n2)]) 122 } else { 123 sb.WriteByte(n2[i]) 124 } 125 } 126 } else { 127 sb.Write(n1) 128 } 129 return sb.String() 130 131 } 132 133 // 获得季字符串的哈希 134 func HashCode(s string) uint32 { 135 v := crc32.ChecksumIEEE(StringToBytes(s)) 136 return v 137 }