Конвертировать руну в int?
В следующем коде я перебираю 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 ответа
Проблема проще, чем кажется. Вы конвертируете rune
значение для int
значение с int(r)
, Но ваш код подразумевает, что вы хотите получить целочисленное значение из ASCII (или UTF-8) представления цифры, которое вы можете получить тривиально r - '0'
как rune
, или же int(r - '0')
как int
, Имейте в виду, что руны вне диапазона повредят эту логику.
Например, 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
Почему бы тебе не сделать только "нить (руну)".
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)
val, _ := strconv.Atoi(string(v))
Где v руна
Более кратко, но та же идея, что и выше