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