/*
|
|
* string functions
|
|
*/
|
|
package helper
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func ToString(v interface{}) string {
|
|
var value string
|
|
switch v.(type) {
|
|
case string:
|
|
value = v.(string)
|
|
case int:
|
|
value = strconv.Itoa(v.(int))
|
|
case float64:
|
|
value = strconv.FormatFloat(v.(float64), 'f', 2, 64)
|
|
case float32:
|
|
value = strconv.FormatFloat(float64(v.(float32)), 'f', 2, 64)
|
|
case int64:
|
|
value = strconv.FormatInt(v.(int64), 10)
|
|
case []uint8:
|
|
value = string(v.([]uint8))
|
|
// case []byte:
|
|
// value = string(v.([]byte))
|
|
case interface{}:
|
|
value = v.(string)
|
|
case nil:
|
|
value = ""
|
|
default:
|
|
log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64")
|
|
}
|
|
return strings.Trim(value, " ")
|
|
}
|
|
|
|
func ToStr(v interface{}) string {
|
|
var value string
|
|
switch v.(type) {
|
|
case string:
|
|
value = v.(string)
|
|
case int:
|
|
value = strconv.Itoa(v.(int))
|
|
case float64:
|
|
value = strconv.FormatFloat(v.(float64), 'f', 0, 64)
|
|
case float32:
|
|
value = strconv.FormatFloat(float64(v.(float32)), 'f', 0, 64)
|
|
case int64:
|
|
value = strconv.FormatInt(v.(int64), 10)
|
|
case []uint8:
|
|
value = string(v.([]uint8))
|
|
// case []byte:
|
|
// value = string(v.([]byte))
|
|
case interface{}:
|
|
value = v.(string)
|
|
case nil:
|
|
value = ""
|
|
default:
|
|
log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64")
|
|
}
|
|
return strings.Trim(value, " ")
|
|
}
|
|
|
|
func ToFloat64(v interface{}) (float64, error) {
|
|
var value float64
|
|
var err error = nil
|
|
switch v.(type) {
|
|
case string:
|
|
v_tmp := v.(string)
|
|
value, _ = strconv.ParseFloat(v_tmp, 64)
|
|
case int:
|
|
value = float64(v.(int))
|
|
case int64:
|
|
value = float64(v.(int64))
|
|
case float64:
|
|
value = v.(float64)
|
|
case interface{}:
|
|
value = v.(float64)
|
|
case nil:
|
|
value = 0
|
|
default:
|
|
err = errors.New("参数值类型错误")
|
|
log.Println("参数值类型错误", v, "not in string|int|float64|interface|int64")
|
|
}
|
|
return value, err
|
|
}
|
|
|
|
func ToInt(inter interface{}) int {
|
|
var value int
|
|
|
|
switch inter.(type) {
|
|
|
|
case string:
|
|
value, _ = strconv.Atoi(inter.(string))
|
|
case int:
|
|
value = inter.(int)
|
|
case int64:
|
|
value = int(inter.(int64))
|
|
case float64:
|
|
value, _ = strconv.Atoi(fmt.Sprintf("%1.0f", inter))
|
|
case nil:
|
|
value = 0
|
|
case interface{}:
|
|
value = inter.(int)
|
|
default:
|
|
log.Println("参数值类型错误", inter, "not in string|int|float64|interface|int64")
|
|
}
|
|
return value
|
|
}
|
|
|
|
func ToInt64(inter interface{}) int64 {
|
|
var value int64
|
|
|
|
switch inter.(type) {
|
|
|
|
case string:
|
|
value, _ = strconv.ParseInt(inter.(string), 10, 64)
|
|
case int:
|
|
value = int64(inter.(int))
|
|
case int64:
|
|
value = inter.(int64)
|
|
case float64:
|
|
value_int, _ := strconv.Atoi(fmt.Sprintf("%1.0f", inter))
|
|
value = int64(value_int)
|
|
case nil:
|
|
value = 0
|
|
case interface{}:
|
|
if _, ok := inter.(int64); !ok {
|
|
value = inter.(int64)
|
|
}
|
|
default:
|
|
log.Println("参数值类型错误", inter, "not in string|int|float64|interface|int64")
|
|
}
|
|
return value
|
|
}
|
|
|
|
//生成随机字符串
|
|
func GetRandomString(length int) string {
|
|
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
bytes := []byte(str)
|
|
result := []byte{}
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
for i := 0; i < length; i++ {
|
|
result = append(result, bytes[r.Intn(len(bytes))])
|
|
}
|
|
return string(result)
|
|
}
|
|
|
|
//生成随机数字
|
|
func GetRandomNumber(length int) string {
|
|
str := "0123456789"
|
|
bytes := []byte(str)
|
|
result := []byte{}
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
for i := 0; i < length; i++ {
|
|
result = append(result, bytes[r.Intn(len(bytes))])
|
|
}
|
|
return string(result)
|
|
}
|
|
|
|
/**
|
|
* 字符串转大驼峰 ios_bbbbbbbb -> IosBbbbbbbbb
|
|
*/
|
|
func StrFirstToUpper(str string) string {
|
|
temp := strings.Split(str, "_")
|
|
var upperStr string
|
|
for y := 0; y < len(temp); y++ {
|
|
vv := []rune(temp[y])
|
|
for i := 0; i < len(vv); i++ {
|
|
if i == 0 {
|
|
vv[i] -= 32
|
|
upperStr += string(vv[i])
|
|
} else {
|
|
upperStr += string(vv[i])
|
|
}
|
|
}
|
|
}
|
|
return upperStr
|
|
}
|
|
|
|
/**
|
|
* 是否存在在字符切片中
|
|
*/
|
|
func IsInStringArray(arr []string, str string) bool {
|
|
var isIn bool = false
|
|
length := len(arr)
|
|
if length < 1 {
|
|
return false
|
|
}
|
|
for _, item := range arr {
|
|
if item == str {
|
|
isIn = true
|
|
break
|
|
}
|
|
}
|
|
return isIn
|
|
}
|
|
|
|
/**
|
|
* 字符串在字符切片中对应索引
|
|
*/
|
|
func InStringArrayIndex(arr []string, str string) int {
|
|
// var isIn bool = false
|
|
length := len(arr)
|
|
if length < 1 {
|
|
return -1
|
|
}
|
|
var index int = -1
|
|
for k, item := range arr {
|
|
if item == str {
|
|
// isIn = true
|
|
index = k
|
|
break
|
|
}
|
|
}
|
|
return index
|
|
}
|
|
|
|
/*
|
|
* 删除多余空格
|
|
* 2019/05/05
|
|
*/
|
|
func DeleteExtraSpace(s string) string {
|
|
s1 := strings.Replace(s, " ", " ", -1) //替换tab
|
|
regstr := "\\s{2,}" //两个及两个以上空格的正则表达式
|
|
reg, _ := regexp.Compile(regstr) //编译正则表达式
|
|
s2 := make([]byte, len(s1))
|
|
copy(s2, s1)
|
|
spc_index := reg.FindStringIndex(string(s2)) //在字符串中搜索
|
|
for len(spc_index) > 0 {
|
|
s2 = append(s2[:spc_index[0]+1], s2[spc_index[1]:]...) //删除多余空格
|
|
spc_index = reg.FindStringIndex(string(s2))
|
|
}
|
|
return string(s2)
|
|
}
|
|
|
|
/*
|
|
* 连接多个字符串
|
|
* 2019/05/05
|
|
*/
|
|
func StringJoin(s ...string) string {
|
|
var build strings.Builder
|
|
if len(s) > 0 {
|
|
for _, v := range s {
|
|
build.WriteString(v)
|
|
}
|
|
}
|
|
|
|
return build.String()
|
|
}
|
|
|
|
/*
|
|
* 连接url
|
|
* 2019/05/05
|
|
*/
|
|
func UrlJoin(host, url string) string {
|
|
if strings.Contains(url, "http://") {
|
|
return url
|
|
}
|
|
if strings.Contains(url, "https://") {
|
|
return url
|
|
}
|
|
|
|
return StringJoin(host, url)
|
|
}
|