将符文转换为int?

mik*_*iku 22 idioms type-conversion go rune

在下面的代码中,我string用符文迭代一个符文,但实际上我需要int执行一些校验和计算.我真的需要来编码rune成一个[]byte,然后将其转换为一个string,然后用Atoi获得的int出来的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
}
Run Code Online (Sandbox Code Playgroud)

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

Gus*_*yer 53

问题比它看起来更简单.你一个转换rune值的int与值int(r).但是你的代码暗示你想要数字的ASCII(或UTF-8)表示中的整数值,你可以简单地将其r - '0'作为a runeint(r - '0')a int.请注意,超出范围的符文会破坏这种逻辑.

  • 对于那些想知道“int(r-'0')”如何工作的人,简短的解释是:“从任何符文‘0’到‘9’中减去符文‘0’的值将得到一个整数 0 到 9” 。减法“r-'0”后的结果类型将是 int32(符文的基本类型),这就是为什么如果您需要“int”类型 - 您还需要“int()”转换。 (2认同)

pet*_*rSO 11

例如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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

124 124
Run Code Online (Sandbox Code Playgroud)