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  }