diff --git a/docs/strutil.md b/docs/strutil.md index e9c74a3..0c29fa2 100644 --- a/docs/strutil.md +++ b/docs/strutil.md @@ -1,4 +1,5 @@ # Strutil + Package strutil contains some functions to manipulate string.
@@ -7,10 +8,10 @@ Package strutil contains some functions to manipulate string. [https://github.com/duke-git/lancet/blob/v1/strutil/string.go](https://github.com/duke-git/lancet/blob/v1/strutil/string.go) - ## Usage: + ```go import ( "github.com/duke-git/lancet/strutil" @@ -20,33 +21,34 @@ import ( ## Index -- [After](#After) -- [AfterLast](#AfterLast) -- [Before](#Before) -- [BeforeLast](#BeforeLast) -- [CamelCase](#CamelCase) -- [Capitalize](#Capitalize) -- [IsString](#IsString) -- [KebabCase](#KebabCase) -- [UpperKebabCase](#UpperKebabCase) -- [LowerFirst](#LowerFirst) -- [UpperFirst](#UpperFirst) -- [PadEnd](#PadEnd) -- [PadStart](#PadStart) -- [Reverse](#Reverse) -- [SnakeCase](#SnakeCase) -- [UpperSnakeCase](#UpperSnakeCase) -- [Wrap](#Wrap) -- [Unwrap](#Unwrap) -- [SplitEx](#SplitEx) - + +- [After](#After) +- [AfterLast](#AfterLast) +- [Before](#Before) +- [BeforeLast](#BeforeLast) +- [CamelCase](#CamelCase) +- [Capitalize](#Capitalize) +- [IsString](#IsString) +- [KebabCase](#KebabCase) +- [UpperKebabCase](#UpperKebabCase) +- [LowerFirst](#LowerFirst) +- [UpperFirst](#UpperFirst) +- [Pad](#Pad) +- [PadEnd](#PadEnd) +- [PadStart](#PadStart) +- [Reverse](#Reverse) +- [SnakeCase](#SnakeCase) +- [UpperSnakeCase](#UpperSnakeCase) +- [Wrap](#Wrap) +- [Unwrap](#Unwrap) +- [SplitEx](#SplitEx) ## Documentation - ### After +Creates substring in source string after position when char first appear.
Signature: @@ -54,6 +56,7 @@ import ( ```go func After(s, char string) string ``` + Example: ```go @@ -74,9 +77,8 @@ func main() { } ``` - - ### AfterLast +Creates substring in source string after position when char last appear.
Signature: @@ -84,6 +86,7 @@ func main() { ```go func AfterLast(s, char string) string ``` + Example: ```go @@ -104,10 +107,8 @@ func main() { } ``` - - - ### Before +Creates substring in source string before position when char first appear.
Signature: @@ -115,6 +116,7 @@ func main() { ```go func Before(s, char string) string ``` + Example: ```go @@ -135,10 +137,8 @@ func main() { } ``` - - - ### BeforeLast +Creates substring in source string before position when char first appear.
Signature: @@ -146,6 +146,7 @@ func main() { ```go func BeforeLast(s, char string) string ``` + Example: ```go @@ -166,10 +167,8 @@ func main() { } ``` - - - ### CamelCase +Coverts string to camelCase string, non letters and numbers will be ignored.
Signature: @@ -177,6 +176,7 @@ func main() { ```go func CamelCase(s string) string ``` + Example: ```go @@ -202,10 +202,8 @@ func main() { fmt.Println(s4) //foo11Bar ``` - - - ### Capitalize +Convert the first character of a string to upper case.
Signature: @@ -213,6 +211,7 @@ func main() { ```go func Capitalize(s string) string ``` + Example: ```go @@ -233,9 +232,8 @@ func main() { } ``` - - ### IsString +Check if the value's data type is string.
Signature: @@ -243,6 +241,7 @@ func main() { ```go func IsString(v interface{}) bool ``` + Example: ```go @@ -261,9 +260,8 @@ func main() { } ``` - - ### KebabCase +KebabCase covert string to kebab-case, non letters and numbers will be ignored.
Signature: @@ -271,6 +269,7 @@ func main() { ```go func KebabCase(s string) string ``` + Example: ```go @@ -294,9 +293,8 @@ func main() { } ``` - - ### UpperKebabCase +UpperKebabCase covert string to upper KEBAB-CASE, non letters and numbers will be ignored.
Signature: @@ -304,6 +302,7 @@ func main() { ```go func KebabCase(s string) string ``` + Example: ```go @@ -327,9 +326,8 @@ func main() { } ``` - - ### LowerFirst +Convert the first character of string to lower case.
Signature: @@ -337,6 +335,7 @@ func main() { ```go func LowerFirst(s string) string ``` + Example: ```go @@ -360,10 +359,8 @@ func main() { } ``` - - - ### UpperFirst +Convert the first character of string to upper case.
Signature: @@ -371,6 +368,7 @@ func main() { ```go func UpperFirst(s string) string ``` + Example: ```go @@ -394,10 +392,53 @@ func main() { } ``` +### Pad +Pads string on the left and right side if it's shorter than size.
+Signature: + +```go +func Pad(source string, size int, padStr string) string +``` + +Example: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/strutil" +) + +func main() { + result1 := strutil.Pad("foo", 1, "bar") + result2 := strutil.Pad("foo", 2, "bar") + result3 := strutil.Pad("foo", 3, "bar") + result4 := strutil.Pad("foo", 4, "bar") + result5 := strutil.Pad("foo", 5, "bar") + result6 := strutil.Pad("foo", 6, "bar") + result7 := strutil.Pad("foo", 7, "bar") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + // Output: + // foo + // foo + // foo + // foob + // bfoob + // bfooba + // bafooba +} +``` ### PadEnd +Pads string on the right side if it's shorter than size.
Signature: @@ -405,33 +446,45 @@ func main() { ```go func PadEnd(source string, size int, padStr string) string ``` + Example: ```go import ( - "fmt" - "github.com/duke-git/lancet/strutil" + "fmt" + "github.com/duke-git/lancet/strutil" ) func main() { - s1 := strutil.PadEnd("a", 1, "b") - fmt.Println(s1) //a + result1 := strutil.PadEnd("foo", 1, "bar") + result2 := strutil.PadEnd("foo", 2, "bar") + result3 := strutil.PadEnd("foo", 3, "bar") + result4 := strutil.PadEnd("foo", 4, "bar") + result5 := strutil.PadEnd("foo", 5, "bar") + result6 := strutil.PadEnd("foo", 6, "bar") + result7 := strutil.PadEnd("foo", 7, "bar") - s2 := strutil.PadEnd("a", 2, "b") - fmt.Println(s2) //ab + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) - s3 := strutil.PadEnd("abcd", 6, "mno") - fmt.Println(s3) //abcdmn - - s4 := strutil.PadEnd("abc", 6, "ab") - fmt.Println(s4) //abcaba + // Output: + // foo + // foo + // foo + // foob + // fooba + // foobar + // foobarb } ``` - - - ### PadStart +Pads string on the left side if it's shorter than size.
Signature: @@ -439,33 +492,45 @@ func main() { ```go func PadStart(source string, size int, padStr string) string ``` + Example: ```go import ( - "fmt" - "github.com/duke-git/lancet/strutil" + "fmt" + "github.com/duke-git/lancet/strutil" ) func main() { - s1 := strutil.PadStart("a", 1, "b") - fmt.Println(s1) //a + result1 := strutil.PadStart("foo", 1, "bar") + result2 := strutil.PadStart("foo", 2, "bar") + result3 := strutil.PadStart("foo", 3, "bar") + result4 := strutil.PadStart("foo", 4, "bar") + result5 := strutil.PadStart("foo", 5, "bar") + result6 := strutil.PadStart("foo", 6, "bar") + result7 := strutil.PadStart("foo", 7, "bar") - s2 := strutil.PadStart("a", 2, "b") - fmt.Println(s2) //ba + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) - s3 := strutil.PadStart("abcd", 6, "mno") - fmt.Println(s3) //mnabcd - - s4 := strutil.PadStart("abc", 6, "ab") - fmt.Println(s4) //abaabc + // Output: + // foo + // foo + // foo + // bfoo + // bafoo + // barfoo + // barbfoo } ``` - - - ### ReverseStr +Return string whose char order is reversed to the given string.
Signature: @@ -473,6 +538,7 @@ func main() { ```go func ReverseStr(s string) string ``` + Example: ```go @@ -490,8 +556,8 @@ func main() { } ``` - ### SnakeCase +Coverts string to snake_case, non letters and numbers will be ignored.
Signature: @@ -499,6 +565,7 @@ func main() { ```go func SnakeCase(s string) string ``` + Example: ```go @@ -525,8 +592,8 @@ func main() { } ``` - ### UpperSnakeCase +Coverts string to upper KEBAB-CASE, non letters and numbers will be ignored.
Signature: @@ -534,6 +601,7 @@ func main() { ```go func SnakeCase(s string) string ``` + Example: ```go @@ -560,9 +628,8 @@ func main() { } ``` - - ### Wrap +Wrap a string with another string.
Signature: @@ -570,6 +637,7 @@ func main() { ```go func Wrap(str string, wrapWith string) string ``` + Example: ```go @@ -596,10 +664,8 @@ func main() { } ``` - - - ### Wrap +Unwrap a given string from anther string. will change str value.
Signature: @@ -607,6 +673,7 @@ func main() { ```go func Unwrap(str string, wrapToken string) string ``` + Example: ```go @@ -633,9 +700,8 @@ func main() { } ``` - - ### SplitEx +Split a given string whether the result contains empty string.
Signature: @@ -643,6 +709,7 @@ func main() { ```go func SplitEx(s, sep string, removeEmptyString bool) []string ``` + Example: ```go @@ -668,8 +735,3 @@ func main() { fmt.Println(arr5) //[]string{" a", "b", "c"} } ``` - - - - - diff --git a/docs/strutil_zh-CN.md b/docs/strutil_zh-CN.md index 7f542b9..423da4e 100644 --- a/docs/strutil_zh-CN.md +++ b/docs/strutil_zh-CN.md @@ -1,5 +1,6 @@ # Strutil -strutil包含处理字符串的相关函数。 + +strutil 包含处理字符串的相关函数。 @@ -7,10 +8,10 @@ strutil包含处理字符串的相关函数。 [https://github.com/duke-git/lancet/blob/v1/strutil/string.go](https://github.com/duke-git/lancet/blob/v1/strutil/string.go) - ## 用法: + ```go import ( "github.com/duke-git/lancet/strutil" @@ -20,34 +21,34 @@ import ( ## 目录 -- [After](#After) -- [AfterLast](#AfterLast) -- [Before](#Before) -- [BeforeLast](#BeforeLast) -- [CamelCase](#CamelCase) -- [Capitalize](#Capitalize) -- [IsString](#IsString) -- [KebabCase](#KebabCase) -- [UpperKebabCase](#UpperKebabCase) -- [LowerFirst](#LowerFirst) -- [UpperFirst](#UpperFirst) -- [PadEnd](#PadEnd) -- [PadStart](#PadStart) -- [Reverse](#Reverse) -- [SnakeCase](#SnakeCase) -- [UpperSnakeCase](#UpperSnakeCase) -- [Wrap](#Wrap) -- [Unwrap](#Unwrap) -- [SplitEx](#SplitEx) - + +- [After](#After) +- [AfterLast](#AfterLast) +- [Before](#Before) +- [BeforeLast](#BeforeLast) +- [CamelCase](#CamelCase) +- [Capitalize](#Capitalize) +- [IsString](#IsString) +- [KebabCase](#KebabCase) +- [UpperKebabCase](#UpperKebabCase) +- [LowerFirst](#LowerFirst) +- [UpperFirst](#UpperFirst) +- [Pad](#Pad) +- [PadEnd](#PadEnd) +- [PadStart](#PadStart) +- [Reverse](#Reverse) +- [SnakeCase](#SnakeCase) +- [UpperSnakeCase](#UpperSnakeCase) +- [Wrap](#Wrap) +- [Unwrap](#Unwrap) +- [SplitEx](#SplitEx) - -## Documentation文档 - +## Documentation 文档 ### After +截取源字符串中char首次出现时的位置之后的子字符串
函数签名: @@ -55,6 +56,7 @@ import ( ```go func After(s, char string) string ``` + 例子: ```go @@ -75,9 +77,8 @@ func main() { } ``` - - ### AfterLast +截取源字符串中char最后一次出现时的位置之后的子字符串
函数签名: @@ -85,6 +86,7 @@ func main() { ```go func AfterLast(s, char string) string ``` + 例子: ```go @@ -105,10 +107,8 @@ func main() { } ``` - - - ### Before +截取源字符串中char首次出现时的位置之前的子字符串
函数签名: @@ -116,6 +116,7 @@ func main() { ```go func Before(s, char string) string ``` + 例子: ```go @@ -136,10 +137,8 @@ func main() { } ``` - - - ### BeforeLast +截取源字符串中char最后一次出现时的位置之前的子字符串
函数签名: @@ -147,6 +146,7 @@ func main() { ```go func BeforeLast(s, char string) string ``` + 例子: ```go @@ -167,10 +167,8 @@ func main() { } ``` - - - ### CamelCase +将字符串转换为驼峰式字符串, 非字母和数字会被忽略
函数签名: @@ -178,6 +176,7 @@ func main() { ```go func CamelCase(s string) string ``` + 例子: ```go @@ -204,10 +203,8 @@ func main() { } ``` - - - ### Capitalize +将字符串的第一个字符转换为大写
函数签名: @@ -215,6 +212,7 @@ func main() { ```go func Capitalize(s string) string ``` + 例子: ```go @@ -235,9 +233,8 @@ func main() { } ``` - - ### IsString +检查值的数据类型是否为字符串
函数签名: @@ -245,6 +242,7 @@ func main() { ```go func IsString(v interface{}) bool ``` + 例子: ```go @@ -263,8 +261,8 @@ func main() { } ``` - ### KebabCase +将字符串转换为kebab-case, 非字母和数字会被忽略
函数签名: @@ -272,6 +270,7 @@ func main() { ```go func KebabCase(s string) string ``` + 例子: ```go @@ -295,9 +294,8 @@ func main() { } ``` - - ### UpperKebabCase +将字符串转换为大写KEBAB-CASE, 非字母和数字会被忽略
函数签名: @@ -305,6 +303,7 @@ func main() { ```go func KebabCase(s string) string ``` + 例子: ```go @@ -328,8 +327,8 @@ func main() { } ``` - ### LowerFirst +将字符串的第一个字符转换为小写
函数签名: @@ -337,6 +336,7 @@ func main() { ```go func LowerFirst(s string) string ``` + 例子: ```go @@ -360,10 +360,8 @@ func main() { } ``` - - - ### UpperFirst +将字符串的第一个字符转换为大写
函数签名: @@ -371,6 +369,7 @@ func main() { ```go func UpperFirst(s string) string ``` + 例子: ```go @@ -394,78 +393,145 @@ func main() { } ``` +### Pad +如果字符串长度短于size,则在左右两侧填充字符串。
+函数签名: + +```go +func Pad(source string, size int, padStr string) string +``` + +示例: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/strutil" +) + +func main() { + result1 := strutil.Pad("foo", 1, "bar") + result2 := strutil.Pad("foo", 2, "bar") + result3 := strutil.Pad("foo", 3, "bar") + result4 := strutil.Pad("foo", 4, "bar") + result5 := strutil.Pad("foo", 5, "bar") + result6 := strutil.Pad("foo", 6, "bar") + result7 := strutil.Pad("foo", 7, "bar") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + // Output: + // foo + // foo + // foo + // foob + // bfoob + // bfooba + // bafooba +} +``` ### PadEnd -如果字符串长度短于size,则在右侧填充字符串
+ +如果字符串长度短于size,则在右侧填充字符串。
函数签名: ```go func PadEnd(source string, size int, padStr string) string ``` -例子: + +示例: ```go import ( - "fmt" - "github.com/duke-git/lancet/strutil" + "fmt" + "github.com/duke-git/lancet/v2/strutil" ) func main() { - s1 := strutil.PadEnd("a", 1, "b") - fmt.Println(s1) //a + result1 := strutil.PadEnd("foo", 1, "bar") + result2 := strutil.PadEnd("foo", 2, "bar") + result3 := strutil.PadEnd("foo", 3, "bar") + result4 := strutil.PadEnd("foo", 4, "bar") + result5 := strutil.PadEnd("foo", 5, "bar") + result6 := strutil.PadEnd("foo", 6, "bar") + result7 := strutil.PadEnd("foo", 7, "bar") - s2 := strutil.PadEnd("a", 2, "b") - fmt.Println(s2) //ab + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) - s3 := strutil.PadEnd("abcd", 6, "mno") - fmt.Println(s3) //abcdmn - - s4 := strutil.PadEnd("abc", 6, "ab") - fmt.Println(s4) //abcaba + // Output: + // foo + // foo + // foo + // foob + // fooba + // foobar + // foobarb } ``` - - - ### PadStart -如果字符串长度短于size,则在左侧填充字符串
+ +如果字符串长度短于size,则在左侧填充字符串。
函数签名: ```go func PadStart(source string, size int, padStr string) string ``` -例子: + +示例: ```go import ( - "fmt" - "github.com/duke-git/lancet/strutil" + "fmt" + "github.com/duke-git/lancet/v2/strutil" ) func main() { - s1 := strutil.PadStart("a", 1, "b") - fmt.Println(s1) //a + result1 := strutil.PadStart("foo", 1, "bar") + result2 := strutil.PadStart("foo", 2, "bar") + result3 := strutil.PadStart("foo", 3, "bar") + result4 := strutil.PadStart("foo", 4, "bar") + result5 := strutil.PadStart("foo", 5, "bar") + result6 := strutil.PadStart("foo", 6, "bar") + result7 := strutil.PadStart("foo", 7, "bar") - s2 := strutil.PadStart("a", 2, "b") - fmt.Println(s2) //ba + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) - s3 := strutil.PadStart("abcd", 6, "mno") - fmt.Println(s3) //mnabcd - - s4 := strutil.PadStart("abc", 6, "ab") - fmt.Println(s4) //abaabc + // Output: + // foo + // foo + // foo + // bfoo + // bafoo + // barfoo + // barbfoo } ``` - - - ### ReverseStr +返回字符顺序与给定字符串相反的字符串
函数签名: @@ -473,6 +539,7 @@ func main() { ```go func ReverseStr(s string) string ``` + 例子: ```go @@ -490,8 +557,8 @@ func main() { } ``` - ### SnakeCase +将字符串转换为snake_case形式, 非字母和数字会被忽略
函数签名: @@ -499,6 +566,7 @@ func main() { ```go func SnakeCase(s string) string ``` + 例子: ```go @@ -525,8 +593,8 @@ func main() { } ``` - ### UpperSnakeCase +将字符串转换为大写SNAKE_CASE形式, 非字母和数字会被忽略
函数签名: @@ -534,6 +602,7 @@ func main() { ```go func SnakeCase(s string) string ``` + 例子: ```go @@ -560,9 +629,8 @@ func main() { } ``` - - ### Wrap +用另一个字符串包裹一个字符串
函数签名: @@ -570,6 +638,7 @@ func main() { ```go func Wrap(str string, wrapWith string) string ``` + 例子: ```go @@ -596,10 +665,8 @@ func main() { } ``` - - - ### Unwrap +用另一个字符串解开包裹一个字符串
函数签名: @@ -607,6 +674,7 @@ func main() { ```go func Unwrap(str string, wrapToken string) string ``` + 例子: ```go @@ -633,9 +701,8 @@ func main() { } ``` - - ### SplitEx +分割字符串为切片,removeEmptyString参数指定是否去除空字符串
函数签名: @@ -643,6 +710,7 @@ func main() { ```go func SplitEx(s, sep string, removeEmptyString bool) []string ``` + 例子: ```go @@ -668,9 +736,3 @@ func main() { fmt.Println(arr5) //[]string{" a", "b", "c"} } ``` - - - - - - diff --git a/strutil/string.go b/strutil/string.go index 7dd3e18..567a064 100644 --- a/strutil/string.go +++ b/strutil/string.go @@ -66,42 +66,22 @@ func LowerFirst(s string) string { return string(r) + s[size:] } -// PadEnd pads string on the right side if it's shorter than size. +// PadStart pads string on the left and right side if it's shorter than size. // Padding characters are truncated if they exceed size. -func PadEnd(source string, size int, padStr string) string { - len1 := len(source) - len2 := len(padStr) - - if len1 >= size { - return source - } - - fill := "" - if len2 >= size-len1 { - fill = padStr[0 : size-len1] - } else { - fill = strings.Repeat(padStr, size-len1) - } - return source + fill[0:size-len1] +func Pad(source string, size int, padStr string) string { + return padAtPosition(source, size, padStr, 0) } // PadStart pads string on the left side if it's shorter than size. // Padding characters are truncated if they exceed size. func PadStart(source string, size int, padStr string) string { - len1 := len(source) - len2 := len(padStr) + return padAtPosition(source, size, padStr, 1) +} - if len1 >= size { - return source - } - - fill := "" - if len2 >= size-len1 { - fill = padStr[0 : size-len1] - } else { - fill = strings.Repeat(padStr, size-len1) - } - return fill[0:size-len1] + source +// PadEnd pads string on the right side if it's shorter than size. +// Padding characters are truncated if they exceed size. +func PadEnd(source string, size int, padStr string) string { + return padAtPosition(source, size, padStr, 2) } // KebabCase covert string to kebab-case diff --git a/strutil/string_internal.go b/strutil/string_internal.go index ca93800..45ea245 100644 --- a/strutil/string_internal.go +++ b/strutil/string_internal.go @@ -96,3 +96,39 @@ func toUpperAll(rs []rune) []rune { } return rs } + +func padAtPosition(str string, length int, padStr string, position int) string { + if len(str) >= length { + return str + } + + if padStr == "" { + padStr = " " + } + + length = length - len(str) + startPadLen := 0 + if position == 0 { + startPadLen = length / 2 + } else if position == 1 { + startPadLen = length + } + endPadLen := length - startPadLen + + charLen := len(padStr) + leftPad := "" + cur := 0 + for cur < startPadLen { + leftPad += string(padStr[cur%charLen]) + cur++ + } + + cur = 0 + rightPad := "" + for cur < endPadLen { + rightPad += string(padStr[cur%charLen]) + cur++ + } + + return leftPad + str + rightPad +} diff --git a/strutil/string_test.go b/strutil/string_test.go index ac9a9a9..f44c040 100644 --- a/strutil/string_test.go +++ b/strutil/string_test.go @@ -168,9 +168,19 @@ func TestLowerFirst(t *testing.T) { } } +func TestPad(t *testing.T) { + assert := internal.NewAssert(t, "TestPad") + + assert.Equal("a ", Pad("a", 2, "")) + assert.Equal("a", Pad("a", 1, "b")) + assert.Equal("ab", Pad("a", 2, "b")) + assert.Equal("mabcdm", Pad("abcd", 6, "m")) +} + func TestPadEnd(t *testing.T) { assert := internal.NewAssert(t, "TestPadEnd") + assert.Equal("a ", PadEnd("a", 2, " ")) assert.Equal("a", PadEnd("a", 1, "b")) assert.Equal("ab", PadEnd("a", 2, "b")) assert.Equal("abcdmn", PadEnd("abcd", 6, "mno"))