2014-01-24 95 views
15

在下面的代碼中,我通過符文遍歷了一個string符文,但實際上我需要一個int來執行一些校驗和計算。我真的需要將rune編碼爲[]byte,然後將其轉換爲string,然後使用Atoirune中獲得int?這是做到這一點的慣用方法嗎?將rune轉換爲int?

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

回答

36

的問題是簡單的比它的外觀。您使用int(r)rune值轉換爲int值。但是,您的代碼意味着您需要從數字的ASCII(或UTF-8)表示中取出整數值,您可以使用r - '0'作爲runeint(r - '0')作爲int將其取平均值。請注意,超出範圍的符文會破壞該邏輯。

7

例如,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 
+0

謝謝,但那不是我想要的。你正在使用42初始化符文 - 根據我的ASCII表格可以產生'*'字符。我得到的是一個字符串和'範圍'產生的符文,代表了角色。在符文上使用int會給我表示的價值,而不是我需要的* display *值。我做了一小段代碼,提示了區別:http://play.golang.org/p/JLlmKnddGv – miku

+0

@miku:查看我修改後的答案。 – peterSO

+0

啊,好戲。我不知道你的答案爲什麼被低估。 – miku