43

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
}

プレイグラウンド: http://play.golang.org/p/noWDYjn5rJ

4

3 に答える 3

97

問題は見た目よりも簡単です。runeで値を値にint変換しますint(r)。しかし、コードは、数字の ASCII (または UTF-8) 表現から整数値が必要であることを意味します。これは、r - '0'としてrune、またはint(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 に答える