zzt.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package util
  6. import (
  7. "bytes"
  8. "runtime"
  9. "strings"
  10. "time"
  11. "unicode"
  12. )
  13. type stringutil struct{}
  14. var StringUtil = &stringutil{}
  15. /*----------------------------------------------------*/
  16. func (StringUtil *stringutil) LineSeparator() string {
  17. var lineSeparator string
  18. if strings.Contains(runtime.GOOS, "windos") {
  19. lineSeparator = "\r\n"
  20. } else if strings.Contains(runtime.GOOS, "mac") {
  21. lineSeparator = "\r"
  22. } else {
  23. lineSeparator = "\n"
  24. }
  25. return lineSeparator
  26. }
  27. func (StringUtil *stringutil) Equals(str1 string, str2 string) bool {
  28. return str1 == str2
  29. }
  30. func (StringUtil *stringutil) EqualsIgnoreCase(str1 string, str2 string) bool {
  31. return strings.ToUpper(str1) == strings.ToUpper(str2)
  32. }
  33. func (StringUtil *stringutil) StartsWith(s string, subStr string) bool {
  34. return strings.Index(s, subStr) == 0
  35. }
  36. func (StringUtil *stringutil) StartWithIgnoreCase(s string, subStr string) bool {
  37. return strings.HasPrefix(strings.ToLower(s), strings.ToLower(subStr))
  38. }
  39. func (StringUtil *stringutil) EndsWith(s string, subStr string) bool {
  40. return strings.LastIndex(s, subStr) == len(s)-1
  41. }
  42. func (StringUtil *stringutil) IsDigit(str string) bool {
  43. if str == "" {
  44. return false
  45. }
  46. sz := len(str)
  47. for i := 0; i < sz; i++ {
  48. if unicode.IsDigit(rune(str[i])) {
  49. continue
  50. } else {
  51. return false
  52. }
  53. }
  54. return true
  55. }
  56. func (StringUtil *stringutil) FormatDir(dir string) string {
  57. dir = strings.TrimSpace(dir)
  58. if dir != "" {
  59. if !StringUtil.EndsWith(dir, PathSeparator) {
  60. dir += PathSeparator
  61. }
  62. }
  63. return dir
  64. }
  65. func (StringUtil *stringutil) HexStringToBytes(s string) []byte {
  66. str := s
  67. bs := make([]byte, 0)
  68. flag := false
  69. str = strings.TrimSpace(str)
  70. if strings.Index(str, "0x") == 0 || strings.Index(str, "0X") == 0 {
  71. str = str[2:]
  72. }
  73. if len(str) == 0 {
  74. return bs
  75. }
  76. var bsChr []byte
  77. l := len(str)
  78. if l%2 == 0 {
  79. bsChr = []byte(str)
  80. } else {
  81. l += 1
  82. bsChr = make([]byte, l)
  83. bsChr[0] = '0'
  84. for i := 0; i < l-1; i++ {
  85. bsChr[i+1] = str[i]
  86. }
  87. }
  88. bs = make([]byte, l/2)
  89. pos := 0
  90. for i := 0; i < len(bsChr); i += 2 {
  91. bt := convertHex(bsChr[i])
  92. bt2 := convertHex(bsChr[i+1])
  93. if int(bt) == 0xff || int(bt2) == 0xff {
  94. flag = true
  95. break
  96. }
  97. bs[pos] = byte(bt*16 + bt2)
  98. pos++
  99. }
  100. if flag {
  101. bs = ([]byte)(str)
  102. }
  103. return bs
  104. }
  105. func convertHex(chr byte) byte {
  106. if chr >= '0' && chr <= '9' {
  107. return chr - '0'
  108. } else if chr >= 'a' && chr <= 'f' {
  109. return chr - 'a' + 10
  110. } else if chr >= 'A' && chr <= 'F' {
  111. return chr - 'A' + 10
  112. } else {
  113. return 0xff
  114. }
  115. }
  116. func (StringUtil *stringutil) BytesToHexString(bs []byte, pre bool) string {
  117. if bs == nil {
  118. return ""
  119. }
  120. if len(bs) == 0 {
  121. return ""
  122. }
  123. hexDigits := "0123456789ABCDEF"
  124. ret := new(strings.Builder)
  125. for _, b := range bs {
  126. ret.WriteByte(hexDigits[0x0F&(b>>4)])
  127. ret.WriteByte(hexDigits[0x0F&b])
  128. }
  129. if pre {
  130. return "0x" + ret.String()
  131. }
  132. return ret.String()
  133. }
  134. func (StringUtil *stringutil) ProcessSingleQuoteOfName(name string) string {
  135. return StringUtil.processQuoteOfName(name, "'")
  136. }
  137. func (StringUtil *stringutil) ProcessDoubleQuoteOfName(name string) string {
  138. return StringUtil.processQuoteOfName(name, "\"")
  139. }
  140. func (StringUtil *stringutil) processQuoteOfName(name string, quote string) string {
  141. if quote == "" || name == "" {
  142. return name
  143. }
  144. temp := name
  145. result := bytes.NewBufferString("")
  146. index := -1
  147. quetoLength := len(quote)
  148. index = strings.Index(temp, quote)
  149. for index != -1 {
  150. result.WriteString(temp[:index+quetoLength])
  151. result.WriteString(quote)
  152. temp = temp[index+quetoLength:]
  153. index = strings.Index(temp, quote)
  154. }
  155. result.WriteString(temp)
  156. return result.String()
  157. }
  158. func (StringUtil *stringutil) FormatTime() string {
  159. return time.Now().Format("2006-01-02 15:04:05")
  160. }
  161. func (StringUtil *stringutil) SubstringBetween(str string, open string, close string) string {
  162. if str == "" {
  163. return ""
  164. }
  165. iopen := -1
  166. if open != "" {
  167. iopen = strings.Index(str, open)
  168. }
  169. iclose := -1
  170. if close != "" {
  171. iclose = strings.LastIndex(str, close)
  172. }
  173. if iopen == -1 && iclose == -1 {
  174. return ""
  175. } else if iopen == -1 {
  176. return str[0:iclose]
  177. } else if iclose == -1 {
  178. return str[iopen:]
  179. } else {
  180. return str[iopen:iclose]
  181. }
  182. }