Go语言 调整分隔符后的所有内容

iih3973s  于 2023-05-11  发布在  Go
关注(0)|答案(5)|浏览(106)

我有一个float 64转换成字符串:30.060671
我正在尝试修剪/删除/chomp 30之后的所有内容
我试过的一些方法:

fmt.Println(strings.TrimRight("30.060671", ".([0-9])"))
fmt.Println(strings.TrimRight("30.060671", "."))
fmt.Println(strings.TrimSuffix("30.060671", "."))
vnzz0bqm

vnzz0bqm1#

一种方法是使用字符串。在句点上拆分:

parts := strings.Split("30.060671", ".")
fmt.Println(parts[0])

另一种选择是先转换为int,然后再转换为字符串:

a := 30.060671
b := int(a)    
fmt.Println(b)
8wtpewkr

8wtpewkr2#

根据@pайтфолд在评论中的建议,在转换为string之前,您应该将float四舍五入。
无论如何,下面是我使用strings.Index.中删除剩余部分的尝试:

func trimStringFromDot(s string) string {
    if idx := strings.Index(s, "."); idx != -1 {
        return s[:idx]
    }
    return s
}

Playground
另外,要回答为什么TrimRightTrimSuffix不能按预期工作,是因为.不是尾随字符串/unicode:
TrimRight返回字符串s的一个切片,其中删除了cutset中包含的所有尾随Unicode代码点。
TrimSuffix返回不带提供的尾随后缀字符串的% s。如果s不以后缀结尾,则不作任何修改地返回s。

icnyk63a

icnyk63a3#

下面是如何获得分隔符的任何一方。
在Go.18之后使用strings.Cut

string := "Symver.0.1.0"
delimiter := "."

leftOfDelimiter, rightOfDelimiter, found := strings.Cut(string, delimiter)

fmt.Println("Left of Delimiter: ", leftOfDelimiter)
fmt.Println("Right of Delimiter: ", rightOfDelimiter)
fmt.Println("Found: ", found)

//Left of Delimiter:  Symver
//Right of Delimiter:  0.1.0
//Found:  true

https://go.dev/play/p/tS4RpBKlxiV
出发前1.18

string := "Symver.0.1.0"
delimiter := "."

leftOfDelimiter := strings.Split(string, delimiter)[0]
rightOfDelimiter := strings.Join(strings.Split(string, delimiter)[1:], delimiter)

fmt.Println("Left of Delimiter: ", leftOfDelimiter)
fmt.Println("Right of Delimiter: ", rightOfDelimiter)   

//Left of Delimiter:  Symver
//Right of Delimiter:  0.1.0

https://play.golang.org/p/HBi4G5tBL9

gdx19jrr

gdx19jrr4#

Go为此提供了一个函数:strings.Cut

before,after,found := strings.Cut("123.456", ".")

你可以只使用before,忽略其余部分:

before,_,_ := strings.Cut("123.456", ".")
svgewumm

svgewumm5#

fmt.Println(fmt.Sprintf("%.0f", 30.060671))

这应该很容易。(顺便说一句:只是补充一下,其中一位评论者最初陈述或暗示了类似的解决方案)。但是你必须只使用字符串,这应该做-

fmt.Println(fmt.Sprintf("%.0f", 30.060671))
    value := "30.060671"
    f := func(c rune) bool {
        return c == ',' || c == ':' || c == '.'
        }
     fields := strings.FieldsFunc(value, f)[0]
    fmt.Printf("%v", fields)

你可以选择分隔符。我不知道这算不算优雅,但是嘿。

相关问题