Ü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"


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.


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"


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
}

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

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 ;)


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
}

-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")
    }   


    }

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.