【问题标题】:Check if string is int检查字符串是否为 int
【发布时间】:2014-04-30 20:33:49
【问题描述】:

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

类似

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

注意:我知道strconv.Atoi 会返回错误,但是还有其他函数可以做到这一点吗?

strconv.Atoi 的问题在于它会为"a7" 返回7

【问题讨论】:

标签: go


【解决方案1】:

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

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

您可以在ScanInts 模式下使用scanner.Scanner(来自text/scanner),或者使用正则表达式来验证字符串,但Atoi 是完成这项工作的正确工具。

【讨论】:

  • 我试图编辑这个,但不知何故不能。它应该是 Printf 而不是 Println。
  • 这个解决方案的问题是“v”值前面的+和-字符也被检测为有效数字。
【解决方案2】:

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

strconv.Atoi 只支持 32 位

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

试试 v := "12345678900123456789"

【讨论】:

    【解决方案3】:

    你可以使用unicode.IsDigit():

    import "unicode"
    
    func isInt(s string) bool {
        for _, c := range s {
            if !unicode.IsDigit(c) {
                return false
            }
        }
        return true
    }
    

    【讨论】:

    • 是否 - .IsDigit() 的结果为真?如果不是负数会爆炸,哈哈。
    • 请注意,这取决于您所说的“int”到底是什么意思。例如。 ٢ 是整数吗? IsDigit 说是,但 strconv.Atoi 无法解析它 play.golang.org/p/aLfLfwDgfr
    【解决方案4】:

    您可以使用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
    

    【讨论】:

    • 你正在拉一个完整的结构验证库来做一些可以用 go 的标准库在两行中完成的事情?
    • 如果值大于 int64 的最大值,可能需要更多行?
    【解决方案5】:

    您也可以使用正则表达式来检查这一点。

    这可能有点矫枉过正,但如果你想扩展你的规则,它也会给你更多的灵活性。

    这里有一些代码示例:

    package main
    
    import (
        "regexp"
    )
    
    var digitCheck = regexp.MustCompile(`^[0-9]+$`)
    
    func main() {
        digitCheck.MatchString("1212")
    }
    

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

    希望对你有帮助;)

    【讨论】:

      【解决方案6】:

      这可能会有所帮助

      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
      }
      

      【讨论】:

        【解决方案7】:

        这会手动检查每个 CHAR 以查看它是否介于 0 和 9 之间。

        func IsDigitsOnly(s string) bool {
            for _, c := range s {
                if c < '0' || c > '9' {
                    return false
                }
            }
            return true
        }
        

        【讨论】:

        • 很高兴添加一个简短的代码解释,就像添加 cmets 到您的实际代码中一样。在这里单独发布代码块是不受欢迎的。我知道这很简单且不言自明,但这就是为什么此答案被标记为低质量的原因。
        【解决方案8】:

        上面发布的大多数解决方案都很简洁。

        以下是不使用任何库的简单解决方案:

        func IsNumericOnly(str string) bool {
        
            if len(str) == 0 {
                return false
            }
        
            for _, s := range str {
                if s < '0' || s > '9' {
                    return false
                }
            }
            return true
        }
        

        测试用例

        func TestIsNumericOnly(t *testing.T) {
            cases := []struct {
                name      string
                str       string
                isNumeric bool
            }{
                {
                    name:      "numeric string",
                    str:       "0123456789",
                    isNumeric: true,
                },
                {
                    name:      "not numeric string",
                    str:       "#0123456789",
                    isNumeric: false,
                },
            }
        
            for _, c := range cases {
                t.Run(c.name, func(t *testing.T) {
                    assert.Equal(t, c.isNumeric, IsNumericOnly(c.str))
                })
            }
        }
        

        【讨论】:

          【解决方案9】:

          你可以检查所有符文是否在 0 到 9 之间

          isNotDigit := func(c rune) bool { return c < '0' || c > '9' }
          b := strings.IndexFunc(s, isNotDigit) == -1
          

          【讨论】:

            【解决方案10】:
            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")
                }   
            
            
                }
            

            【讨论】:

            • 如果您解释您认为您的建议如何解决问题,您的贡献将带来更多价值。尤其是因为已经有一个非常优雅、可以接受的答案满足 OP 的要求。
            • 不包含小写a-z的字符串不一定是数字。
            • "#@#2$%^4^^^$$#!!)(*&&____123" 是这个答案的数字:(
            • 应该没问题,` import "fmt" import "regexp" func main() { youString :="a12345" match, _ := regexp.MatchString("([0-9]+ $)", youString) if match{ fmt.Println("Is Number") } else{ fmt.Println("Not Is Number") } }`
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-28
            相关资源
            最近更新 更多