检查字符串是否为int


74

如何在Go中检查字符串值是否为整数?

就像是

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

注意:我知道这会strconv.Atoi返回错误,但是还有其他函数可以执行此操作吗?

的问题strconv.Atoi是,它会返回7"a7"


2
strconv.Atoi返回“ 7a”错误。play.golang.org/p/MTfQSOqPW3
Paul Hankin

1
没错,我在测试中搞砸了
K2xL 2014年

Answers:


143

如您所说,您可以使用strconv.Atoi。

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

您可以在mode中使用scanner.Scanner(from text/scanner),也可以使用ScanIntsregexp验证字符串,但这Atoi是完成此任务的正确工具。


1
我试图进行编辑,但是不知何故。它应该是Printf而不是Println。

2
该解决方案的问题是“ v”值前面的+和-字符也被检测为有效数字。
John Doe

26

这样更好,您可以检查最多64位(或更少)位的整数

strconv.Atoi仅支持32位

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

用v尝试:=“ 12345678900123456789”



7

您可以使用govalidator

govalidator.IsInt("123")  // true


完整的例子

package main

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

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

输出:

$ go run intcheck.go
Is it a Integer?  true

9
您要拉整个结构验证库来完成go的标准库两行可以完成的工作吗?
mbuechmann '18

如果该值大于int64的最大值,可能需要更多行?
Mudream

3

您也可以使用regexp进行检查。

这可能有点矫kill过正,但是如果您想扩展规则,它也为您提供了更大的灵活性。

下面是一些代码示例:

package main

import (
    "regexp"
)

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

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

如果您想看到它正在运行:https : //play.golang.org/p/6JmzgUGYN3u

希望能帮助到你 ;)


1

这可能会有所帮助

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
如果您解释您的建议如何解决问题,那么您的贡献将带来更多价值。特别是因为已经有一个非常优雅的,可以接受的答案,可以满足OP的要求。
辛迪·梅斯特

2
不包含小写字母的字符串 a-z不一定是数字。
jsageryd

“#@#2 $%^ 4 ^^^ $$#!!)(* && ____ 123”是这个答案的数字:(
Daniel Krom

应该没问题,`import“ fmt” import“ regexp” func main(){youString:=“ a12345”匹配,_:= regexp.MatchString(“([[0-9] + $)”,youString)如果匹配{fmt.Println(“ Is Number”)} else {fmt.Println(“ Not Is Number”)}}`
ULLAS K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.