2014-01-24 5 views
15

다음 코드에서는 string 룬을 룬으로 반복하지만 실제로 체크섬 계산을 수행하려면 int이 필요합니다. rune[]byte으로 인코딩 한 다음 string으로 변환 한 다음 Atoi을 사용하여 rune에서 int을 얻으시겠습니까? 이것은 그것을하는 관용구적인 방법입니까? 놀이터에 룬을 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

문제는보기보다 간단하다. rune 값을 int(r)으로 int 값으로 변환합니다. 그러나 코드는 r - '0'rune 또는 int(r - '0')int으로 삼아 숫자의 ASCII (또는 UTF-8) 표현에서 정수 값을 얻고 자 함을 의미합니다. 범위를 벗어나는 룬은 해당 논리를 손상시킵니다.

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

고마워요,하지만 그건 내가 원하는 것만은 아닙니다. 내 ASCII 테이블에 따라'*'문자를 생성하는 룬을 42로 초기화하고 있습니다. 내가 얻는 것은 문자열이고 '범위'는 문자를 나타내는 룬 문자입니다. 룬에 int를 사용하면 표시 값이 아니라 표시 값이됩니다. 차이점을 암시하는 짧은 발췌 문장을 만들었습니다. http://play.golang.org/p/JLlmKnddGv – miku

+0

@miku : 내 수정 된 답변을 참조하십시오. – peterSO

+0

아, 좋은 속임수. 나는 왜 당신의 대답이 downvoted 모르겠어요. – miku