1 Star 0 Fork 1

技术狼/go-fun

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
str.go 12.75 KB
一键复制 编辑 原始数据 按行查看 历史
技术狼 提交于 1年前 . no message
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
/*
// @title: 字符串相关函数
// @auth: 技术狼(jishulang.com)
*/
package fun
import (
"fmt"
"math/big"
"math/rand"
"regexp"
"sort"
"strconv"
"strings"
"time"
)
// @title: 生成N个随机字符
// @param: 个数(int)
// @return: 字符串(string)
// @description: a-z,A-Z,0-9
// @date: 2022/7/3 21:07
func RandString(n int) string {
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var src = rand.NewSource(time.Now().UnixNano())
const (
letterIdxBits = 6
letterIdxMask = 1<<letterIdxBits - 1
letterIdxMax = 63 / letterIdxBits
)
b := make([]byte, n)
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return string(b)
}
// @title: 是否手机号
// @param: 手机号(string)
// @return: true/false(bool)
// @description:
// @date: 2022/7/3 21:10
func IsMobile(mobile string) bool {
if len(mobile) != 11 {
return false
}
result, _ := regexp.MatchString(`^(1[3|4|5|6|7|8|9][0-9]\d{4,8})$`, mobile)
if result {
return true
}
return false
}
// @title: 手机号*号处理
// @param: 手机号(string)
// @return: 加*号的手机号(string)
// @description: 非手机号则直接返回原字符
// @date: 2022/7/3 21:13
func MobileStar(mobile string) string {
if IsMobile(mobile) {
return mobile[:3] + "****" + mobile[7:]
}
return mobile
}
// @title: 是否邮箱
// @param: 邮箱(string)
// @return: true/false(bool)
// @description:
// @date: 2022/7/3 21:16
func IsEmail(email string) bool {
pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$`
reg := regexp.MustCompile(pattern)
return reg.MatchString(email)
}
// @title: string转int
// @param: 字符串(str)
// @return: int, error
// @description:
// @date: 2022/7/3 21:18
func StrToInt(val string) (int, error) {
i, err := strconv.Atoi(val)
if err != nil {
return 0, err
}
return i, nil
}
// @title: string转int64
// @param: 字符串(str)
// @return: int64,error
// @description:
// @date: 2022/7/3 21:25
func StrToInt64(val string) (int64, error) {
i, err := strconv.ParseInt(val, 10, 64)
if err != nil {
{
f64, err := strconv.ParseFloat(val, 64)
if err == nil {
return int64(f64), nil
}
}
if IsScientificNotation(val) {
v, err := RetainDecimalPlaces(val, 0)
if err != nil {
return 0, err
}
return StrToInt64(v)
}
return 0, err
}
return i, nil
}
// @title: string转uint64
// @param: 字符串(str)
// @return: uint64,error
// @description:
// @date: 2022/7/3 21:28
func StrToUint64(val string) (uint64, error) {
i, err := StrToInt64(val)
if err != nil {
return 0, err
}
ui := uint64(i)
return ui, nil
}
// @title: string转Float64
// @param: 字符串(str)
// @return: float64, error
// @description:
// @date: 2022/7/3 21:29
func StrToFloat64(val string) (float64, error) {
f, err := strconv.ParseFloat(val, 64)
if err != nil {
return 0, err
}
return f, nil
}
// @title: string转*big.Float
// @param: 字符串(str)
// @return: *big.Float, bool
// @description:
// @date: 2022/7/3 21:31
func StrToBigFloat(str string) (*big.Float, bool) {
bigval, ok := new(big.Float).SetString(str)
if !ok {
return nil, false
}
return bigval, true
}
// @title: string转*big.Int
// @param: (字符)string,(精度位)int64
// @return: *big.Int, bool
// @description:
// @auth: 技术狼
// @date: 2022/7/3 21:00
func StrToBigInt(str string, exp int64) (*big.Int, bool) {
expStr := fmt.Sprintf("1e%d", exp) // "1e" + "8"
amount := new(big.Rat)
_, ok := amount.SetString(str)
if !ok {
return nil, false
}
bigexp := new(big.Rat)
_, ok2 := bigexp.SetString(expStr)
if !ok2 {
return nil, false
}
result := new(big.Rat).Mul(amount, bigexp)
result.FloatString(0)
return new(big.Int).SetString(result.FloatString(0), 10)
}
// @title: 某字符串是否存在数组中
// @param: 字符(string),数组(array)
// @return: 布尔(bool)
// @description:
// @date: 2022/7/3 21:33
func StrIsInArr(target string, str_array []string) bool {
sort.Strings(str_array)
index := sort.SearchStrings(str_array, target)
//index的取值:[0,len(str_array)]
if index < len(str_array) && str_array[index] == target { //需要注意此处的判断,先判断 &&左侧的条件,如果不满足则结束此处判断,不会再进行右侧的判断
return true
}
return false
}
// @title: string是否是浮点
// @param: 字符串(str)
// @return: bool
// @description:
// @date: 2024/7/16 19:15
func StrIsFloat(val string) bool {
_, err := strconv.ParseFloat(val, 64)
return err == nil
}
// @title: 某字符是否存在字符串中
// @param: 某字符(string),字符串(string)
// @return: bool
// @description:
// @date: 2024/7/16 19:15
func IsInString(target string, strs string) bool {
if find := strings.Contains(strs, target); find {
return true
}
return false
}
// @title: 是否是字符类型
// @param:
// @return: bool
// @description:
// @date: 2024/7/16 19:15
func IsString(val interface{}) bool {
if GetType(val) == "string" {
return true
}
return false
}
// @title: 字符串打散为数组
// @param: 分割字符串(string),要分割的字符串(string)
// @return: 数组(map[int]string)
// @description:
// @date: 2024/7/16 19:15
func Explode(separator, str string) []string {
return strings.Split(str, separator)
}
// @title: 获取字符串中字符的数量
// @param: 字符串(string)
// @return: 数量(int)
// @description:
// @date: 2024/7/16 19:15
func MbStrLen(str string) int {
return len([]rune(str))
}
// @title: 字符串首字母转成小写
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Lcfirst(str string) string {
if len(str) == 0 {
return ""
}
s := []rune(str)
if s[0] >= 65 && s[0] <= 90 {
s[0] += 32
}
return string(s)
}
// @title: 字符串首字母转成大写
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Ucfirst(str string) string {
if len(str) == 0 {
return ""
}
s := []rune(str)
if s[0] >= 97 && s[0] <= 122 {
s[0] -= 32
}
return string(s)
}
// @title: 字符串全转大写
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func StrToUpper(str string) string {
return strings.ToUpper(str)
}
// @title: 字符串全转小写
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func StrToLower(str string) string {
return strings.ToLower(str)
}
// @title: 每个单词的首字符转换为大写
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Ucword(str string) string {
return strings.Title(str)
}
// @title: 移除字符串两侧的字符
// @param: 字符串(string),要移除的字符(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Trim(str, charlist string) string {
if charlist == "" {
charlist = " \r\n\t\x0B"
}
return strings.Trim(str, charlist)
}
// @title: 去除全部空格
// @param: 字符串(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func TrimAll(str string) string {
if len(str) == 0 {
return ""
}
return strings.Join(strings.Fields(str), "")
}
// @title: 移除字符串左侧的字符
// @param: 字符串(string),要移除的字符(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Ltrim(str, charlist string) string {
if charlist == "" {
charlist = " \r\n\t\x0B"
}
return strings.TrimLeft(str, charlist)
}
// @title: 移除字符串右侧的字符
// @param: 字符串(string),要移除的字符(string)
// @return: 字符串(string)
// @description:
// @date: 2024/7/16 19:15
func Rtrim(str, substr string) string {
if substr == "" {
substr = " \r\n\t\x0B"
}
/*
TrimRight 是设计来移除单个字符的,而不是整个子串,
如果提供了一个子串作为 charlist,它实际上会尝试从右侧开始移除该子串中的每一个字符,
直到遇到不匹配的字符为止。
*/
return strings.TrimRight(str, substr)
}
// @title: 返回字符串中第一个字符的 ASCII 值
// @param: 字符串(string)
// @return: ASCII值(int)
// @description:
// @date: 2024/7/16 19:15
func Ord(str string) int {
if str == "" {
return 0
}
s := []rune(str)
return int(s[0])
}
// @title: 传ASCII值返回字符
// @param: ASCII值(int32)
// @return: 字符(string)
// @description:
// @date: 2024/7/16 19:15
func Chr(ascii int32) string {
return string(ascii)
}
// @title: 指定字符串重复N次
// @param: 字符串(string),次数(int)
// @return: 字符(string)
// @description:
// @date: 2024/7/16 19:15
func StrRepeat(input string, multiplier int) string {
return strings.Repeat(input, multiplier)
}
// @title: 字符替换
// @param: 要替换的字符串(string),旧字符(string),新字符(string)
// @return: string
// @description:
// @date: 2022/7/4 22:14
func StrReplace(strs string, oldStr string, newStr string) string {
return strings.Replace(strs, oldStr, newStr, -1)
}
// @title: 是否是科学计数
// @param: str(科学计数。如:"4.843671275939215e+21")
// @return: bool
// @description:
// @date: 2024/6/11 22:30
func IsScientificNotation(s string) bool {
// 正则表达式匹配科学计数法
// 匹配形如 [+-]?\d+(\.\d+)?[eE][+-]?\d+ 的字符串
regex := regexp.MustCompile(`^[+-]?\d+(\.\d+)?[eE][+-]?\d+$`)
return regex.MatchString(s)
}
// @title: 将科学计数转换为字符串数字
// @param: val(科学计数。如:4.843671275939215e+21)
// @param: decimalPlaces(精度,小数点位数)
// @return: string, error
// @description:
// @date: 2024/6/1 10:21
func ScientificNotationToStrings(val string, decimalPlaces uint) (string, error) {
// 解析科学记数法字符串为float64
value, err := strconv.ParseFloat(val, 64) // 使用的是IEEE 754双精度浮点数标准,它只能保证大约15-17位的十进制精度。
if err != nil {
return "", err
}
str := fmt.Sprintf("%v", val)
arr := Explode(".", str)
if len(arr[0]) >= 15 || len(arr[1]) >= 13 {
// 创建一个新的big.Float实例,用于保存转换后的数值
value := new(big.Rat)
// 尝试将科学记数法字符串解析为big.Float
_, ok := value.SetString(val)
if !ok {
return "", fmt.Errorf("Failed to parse scientific notation: %s", val)
}
decimalStr := value.FloatString(int(decimalPlaces))
return decimalStr, nil
}
// 使用%.decimalPlacesf格式化,根据参数指定小数位数
decimalStr := fmt.Sprintf("%.*f", int(decimalPlaces), value)
return decimalStr, nil
}
// @title: 获取小数点后的位数
// @param: str
// @return: int
// @description:(非浮点值、科学计数返回0)
// @date: 2024/6/11 22:32
func CountDecimalPlaces(val string) int {
if !StrIsFloat(val) {
return 0
}
if IsScientificNotation(val) {
return 0
}
// 将字符串以小数点为分隔符进行切分
parts := strings.Split(val, ".")
// 如果小数点后有部分,则表示有位数
if len(parts) > 1 && len(parts[1]) > 0 {
// 返回小数点后的位数
return len(parts[1])
}
// 如果没有小数点或者小数点后没有数字,则返回0
return 0
}
// @title: 保留n位小数
// @param: amount 金额
// @param: precision 要保留多少位小数
// @return: int
// @description:
// @date: 2024/6/11 22:34
func RetainDecimalPlaces(amount string, precision uint) (string, error) {
floatInput, err := strconv.ParseFloat(amount, 64)
if err != nil {
return amount, err
}
result := fmt.Sprintf("%.*f", precision, floatInput)
return result, nil
}
// @title: 金额精度
// @param: amount(金额。如:4.8436712000000)
// @param: maxDecimals(小数位数)
// @return: string
// @description:
// @date: 2024/6/11 22:35
func AmountDecimal(amount string, maxDecimals uint) string {
if IsScientificNotation(amount) {
amount, _ = ScientificNotationToStrings(amount, maxDecimals)
} else {
decimalLen := CountDecimalPlaces(amount)
if uint(decimalLen) > maxDecimals {
a, _ := RetainDecimalPlaces(amount, uint(maxDecimals))
amount = a
}
}
amount = RemoveAllZerosFromLastDecimal(amount)
return amount
}
// @title: 移出小数点后无效的数
// @param: amount(金额。如:4.8436712000000)
// @return: string
// @description:
// @date: 2024/6/1 10:21
func RemoveAllZerosFromLastDecimal(amount string) string {
if amount == "" {
return amount
}
if idx := strings.LastIndex(amount, "."); idx != -1 {
rightStr := strings.TrimRight(amount[idx+1:], "0")
amount = amount + "." // 确保小数点还在,即使所有小数位都是0
leftStr := amount[:idx]
if rightStr == "" {
return leftStr
}
return leftStr + "." + rightStr
}
return amount
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/jishulangcom/go-fun.git
git@gitee.com:jishulangcom/go-fun.git
jishulangcom
go-fun
go-fun
v0.0.4

搜索帮助