Überprüfen Sie, ob der String int ist

74

Wie kann ich überprüfen, ob ein Zeichenfolgenwert in Go eine Ganzzahl ist oder nicht?

Etwas wie

v := "4"
if isInt(v) {
  fmt.Println("We have an int, we can safely cast this with strconv")
}

Hinweis: Ich weiß, dass dies strconv.Atoieinen Fehler zurückgibt, aber gibt es eine andere Funktion, um dies zu tun?

Das Problem mit dem strconv.Atoiist , dass sie zurückkehren wird 7für"a7"

K2xL
quelle
2
strconv.Atoigibt einen Fehler für "7a" zurück. play.golang.org/p/MTfQSOqPW3
Paul Hankin
1
Du hast recht, ich habe meine Tests
durcheinander gebracht

Antworten:

143

Wie Sie sagten, können Sie dafür strconv.Atoi verwenden.

if _, err := strconv.Atoi(v); err == nil {
    fmt.Printf("%q looks like a number.\n", v)
}

Sie können scanner.Scanner(von text/scanner) im Modus verwenden ScanIntsoder einen regulären Ausdruck verwenden, um die Zeichenfolge zu überprüfen, dies Atoiist jedoch das richtige Werkzeug für den Job.

Paul Hankin
quelle
1
Ich habe versucht, dies zu bearbeiten, kann es aber irgendwie nicht. Es sollte Printf sein, nicht Println.
2
Problem bei dieser Lösung ist, dass + und - Zeichen vor dem Wert "v" ebenfalls als gültige Zahl erkannt werden.
John Doe
26

Dies ist besser, Sie können nach Ints bis zu 64 (oder weniger) Bits suchen

strconv.Atoi unterstützt nur 32 Bit

if _, err := strconv.ParseInt(v,10,64); err == nil {
    fmt.Printf("%q looks like a number.\n", v)
}

Probieren Sie es mit v aus: = "12345678900123456789"

Mohit Bhura
quelle
11

Sie können verwenden unicode.IsDigit():

import "unicode"

func isInt(s string) bool {
    for _, c := range s {
        if !unicode.IsDigit(c) {
            return false
        }
    }
    return true
}
Richard Dingwall
quelle
Ergibt - für .IsDigit () true? Wenn nicht negative Zahlen blasen würden, lol.
Steviesama
Beachten Sie, dass dies davon abhängt, was genau Sie mit 'int' meinen. ZB ist ٢ ein int? IsDigitsagt ja, strconv.Atoikann es aber nicht analysieren play.golang.org/p/aLfLfwDgfr
Alec
7

Sie können verwenden govalidator.

Code

govalidator.IsInt("123")  // true


Vollständiges Beispiel

package main

import (
    "fmt"
    valid "github.com/asaskevich/govalidator"
)

func main() {
    fmt.Println("Is it a Integer? ", valid.IsInt("978"))
}

Ausgabe:

$ go run intcheck.go
Is it a Integer?  true
Kasper
quelle
9
Sie ziehen eine ganze Strukturvalidierungsbibliothek, um etwas zu tun, das mit der Standardbibliothek des Go in zwei Zeilen ausgeführt werden kann?
mbuechmann
Benötigen Sie möglicherweise mehr Zeilen, wenn der Wert größer als das Maximum von int64 ist?
Mudream
3

Sie können dies auch mit regexp überprüfen.

Es kann ein wenig übertrieben sein, bietet Ihnen aber auch mehr Flexibilität, wenn Sie Ihre Regeln erweitern möchten.

Hier ein Codebeispiel:

package main

import (
    "regexp"
)

var digitCheck = regexp.MustCompile(`^[0-9]+$`)

func main() {
    digitCheck.MatchString("1212")
}

Wenn Sie möchten, dass es ausgeführt wird: https://play.golang.org/p/6JmzgUGYN3u

Ich hoffe es hilft ;)

nicolasassi
quelle
1

das könnte helfen

func IsInt(s string) bool {
    l := len(s)
    if strings.HasPrefix(s, "-") {
        l = l - 1
        s = s[1:]
    }

    reg := fmt.Sprintf("\\d{%d}", l)

    rs, err := regexp.MatchString(reg, s)

    if err != nil {
        return false
    }

    return rs
}
Endoffight
quelle
-9
import "fmt"
import "regexp"

func main() {
    youString :="a12345"
    match, _ := regexp.MatchString("([a-z]+)", youString)
    if  !match{
     fmt.Println("Is Number")
    } else{
     fmt.Println("Not Is Number")
    }   


    }
Julio César Benito
quelle
2
Ihr Beitrag würde mehr Wert bringen, wenn Sie erklären, wie Ihr Vorschlag die Frage löst. Zumal es bereits eine sehr elegante, akzeptierte Antwort gibt, die den Anforderungen des OP entspricht.
Cindy Meister
2
Eine Zeichenfolge, die keinen Kleinbuchstaben enthält, a-zist nicht unbedingt eine Zahl.
jsageryd
"# @ # 2 $% ^ 4 ^^^ $$ # !!) (* && ____ 123" ist eine Zahl durch diese Antwort :(
Daniel Krom
Dies sollte in Ordnung sein, `import" fmt "import" regexp "func main () {youString: =" a12345 "match, _: = regexp.MatchString (" ([0-9] + $) ", youString) falls übereinstimmend {fmt.Println ("Ist Nummer")} else {fmt.Println ("Nicht ist Nummer")}} `
ULLAS K