2014-01-24 26 views
15

Im folgenden Code, ich Iterieren über eine string Rune von Rune, aber ich brauche tatsächlich eine int, um einige Prüfsummenberechnung durchzuführen. Muss ich die rune wirklich in eine []byte kodieren, dann in eine string umwandeln und dann Atoi verwenden, um eine int aus der rune zu bekommen? Ist das der idiomatische Weg, es zu tun?Konvertiere Rune in 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 
} 

Auf dem Spielplatz: http://play.golang.org/p/noWDYjn5rJ

Antwort

36

Das Problem ist einfacher, als es aussieht. Sie konvertieren einen rune Wert in einen int Wert mit int(r). Aber Ihr Code impliziert, dass Sie den Integer-Wert aus der ASCII- (oder UTF-8-) Darstellung der Ziffer wollen, die Sie mit r - '0' als rune oder int(r - '0') als int erhalten können. Sei dir bewusst, dass Out-of-Range-Runen diese Logik verfälschen.

7

Zum Beispiel 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) 
} 

Ausgang:

124 124 
+0

Danke, aber das ist nicht ganz das, was ich will. Du initialisierst die Rune mit 42 - das würde nach meiner ASCII-Tabelle das Zeichen '*' ergeben. Was ich bekomme, ist eine Zeichenkette und "Range" ergibt Runen, die den Charakter darstellen. Wenn int auf der Rune verwendet wird, würde ich den Wert der Repräsentation angeben, nicht den Wert * display *, den ich brauche. Ich habe einen kurzen Ausschnitt gemacht, der auf den Unterschied hinweist: http://play.golang.org/p/JLlmKnddGv – miku

+0

@miku: siehe meine überarbeitete Antwort. – peterSO

+0

Ah, schöner Trick. Ich weiß nicht, warum deine Antwort abgelehnt wurde. – miku

Verwandte Themen