Преобразовать руну в 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
Ответы
Ответ 1
Проблема проще, чем выглядит. Вы преобразуете значение rune
в значение int
с помощью int(r)
. Но ваш код означает, что вы хотите получить целочисленное значение из представления цифры ASCII (или UTF-8), которое вы можете тривиально получить с помощью r - '0'
как rune
или int(r - '0')
как int
. Имейте в виду, что руны вне диапазона могут испортить эту логику.
Ответ 2
Например, 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