web-dev-qa-db-fra.com

Convertir une rune en int?

Dans le code suivant, j'itère une string rune par rune, mais j'ai en fait besoin d'un int pour effectuer un calcul de somme de contrôle. Dois-je vraiment besoin de coder le rune en []byte, puis le convertir en string puis utiliser Atoi pour obtenir un int du rune? Est-ce la façon idiomatique de le faire?

// 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
}

Sur le terrain de jeu: http://play.golang.org/p/noWDYjn5rJ

23
miku

Le problème est plus simple qu'il n'y paraît. Vous convertissez une valeur rune en une valeur int avec int(r). Mais votre code implique que vous voulez que la valeur entière de la représentation ASCII (ou UTF-8) du chiffre, que vous pouvez obtenir trivialement avec r - '0' En tant que rune ou int(r - '0') en tant que int. N'oubliez pas que les runes hors de portée corrompront cette logique.

59
Gustavo Niemeyer

Par exemple, 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)
}

Production:

124 124
12
peterSO

pourquoi ne faites-vous que "string (rune)".

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)
0
Mowazzem Hosen