亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 遞增字符串中的數字(使用符文)

Golang 遞增字符串中的數字(使用符文)

Go
繁花如伊 2023-05-15 09:55:33
我有一個混合了字符和數字的字符串,但我想增加最后一個恰好是數字的字符,這就是我所擁有的,它有效,但是一旦我達到 10 符文就變成黑色,因為十進制為零,是有更好的方法嗎?package mainimport (    "fmt")func main() {str := "version-1.1.0-8"rStr := []rune(str)last := rStr[len(rStr)-1]rStr[len(rStr)-1] = last + 1}所以這適用于 str := "version-1.1.0-8" = version-1.1.0-9 str := version-1.1.0-9 = version-1.1.0-我明白為什么會這樣,但我不知道如何解決
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

您的意圖是增加最后一個符文表示的數字,因此您應該這樣做:解析該數字,將其增加為數字,然后將其“重新編碼”為字符串。

您不能對單個符文進行操作,因為一旦數量達到10,就只能使用 2 個符文來表示。另一個問題是,如果最后一個數字是19,增加它需要改變以前的符文(而不是添加新的符文)。

解析數字并重新編碼比人們想象的要容易得多。

您可以利用fmt包的fmt.Sscanf()功能fmt.Sprintf()。解析和重新編碼只是一個函數調用。

讓我們將此功能包裝到一個函數中:

const format = "version-%d.%d.%d-%d"


func incLast(s string) (string, error) {

? ? var a, b, c, d int

? ? if _, err := fmt.Sscanf(s, format, &a, &b, &c, &d); err != nil {

? ? ? ? return "", err

? ? }


? ? d++

? ? return fmt.Sprintf(format, a, b, c, d), nil

}

測試它:


s := "version-1.1.0-8"


for i := 0; i < 13; i++ {

? ? var err error

? ? if s, err = incLast(s); err != nil {

? ? ? ? panic(err)

? ? }

? ? fmt.Println(s)

}

輸出(在Go Playground上嘗試):

version-1.1.0-9

version-1.1.0-10

version-1.1.0-11

version-1.1.0-12

version-1.1.0-13

version-1.1.0-14

version-1.1.0-15

version-1.1.0-16

version-1.1.0-17

version-1.1.0-18

version-1.1.0-19

version-1.1.0-20

version-1.1.0-21

另一種選擇是只解析和重新編碼最后一部分,而不是完整的版本文本。這就是它的樣子:


func incLast2(s string) (string, error) {

? ? i := strings.LastIndexByte(s, '-')

? ? if i < 0 {

? ? ? ? return "", fmt.Errorf("invalid input")

? ? }


? ? d, err := strconv.Atoi(s[i+1:])

? ? if err != nil {

? ? ? ? return "", err

? ? }


? ? d++

? ? return s[:i+1] + strconv.Itoa(d), nil

}

測試和輸出是一樣的。在Go Playground試試這個。



查看完整回答
反對 回復 2023-05-15
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號