43

在下面的代码中,我逐个遍历一个stringrune,但实际上我需要一个 runeint来执行一些校验和计算。我是否真的需要将 a 编码rune为 a []byte,然后将其转换为 a string,然后用于Atoi从 a 中int取出a rune?这是惯用的方法吗?

// The string `s` only contains digits.
var factor int
for i, c := range s[:12] {
    if i % 2 == 0 {
        factor = 1
    } else {
        factor = 3
    }
    buf := make([]byte, 1)
    _ = utf8.EncodeRune(buf, c)
    value, _ := strconv.Atoi(string(buf))
    sum += value * factor
}

在操场上:http ://play.golang.org/p/noWDYjn5rJ

4

3 回答 3

97

问题比看起来简单。使用 将rune值转换为intint(r)。但是您的代码暗示您希望从数字的 ASCII(或 UTF-8)表示形式中获取整数值,您可以轻松地将其r - '0'作为 aruneint(r - '0')作为int. 请注意,超出范围的符文会破坏该逻辑。

于 2014-01-24T01:23:27.577 回答
13

例如sum += (int(c) - '0') * factor

package main

import (
    "fmt"
    "strconv"
    "unicode/utf8"
)

func main() {
    s := "9780486653556"
    var factor, sum1, sum2 int
    for i, c := range s[:12] {
        if i%2 == 0 {
            factor = 1
        } else {
            factor = 3
        }
        buf := make([]byte, 1)
        _ = utf8.EncodeRune(buf, c)
        value, _ := strconv.Atoi(string(buf))
        sum1 += value * factor
        sum2 += (int(c) - '0') * factor
    }
    fmt.Println(sum1, sum2)
}

输出:

124 124
于 2014-01-24T00:36:53.860 回答
2

你为什么不只做“字符串(符文)”。

s:="12345678910"
var factor,sum int
for i,x:=range s{
    if i%2==0{
            factor=1
        }else{
        factor=3
    }
        xstr:=string(x) //x is rune converted to string
        xint,_:=strconv.Atoi(xstr)
        sum+=xint*factor
}
fmt.Println(sum)
于 2019-11-22T01:33:08.693 回答