在Go中将字符串转换为整数类型?

Mat*_*ner 212 string type-conversion go

我试图从返回的字符串转换flag.Arg(n)int.在Go中这样做的惯用方法是什么?

pet*_*rSO 264

例如,

package main

import (
    "flag"
    "fmt"
    "os"
    "strconv"
)

func main() {
    flag.Parse()
    s := flag.Arg(0)
    // string to int
    i, err := strconv.Atoi(s)
    if err != nil {
        // handle error
        fmt.Println(err)
        os.Exit(2)
    }
    fmt.Println(s, i)
}
Run Code Online (Sandbox Code Playgroud)

  • `func main(){...}`不带参数,也不返回任何值.使用`os`包`Exit`函数,例如`os.Exit(2).` (14认同)
  • @RoshanaPitigala“A”,如 A 到 Z 所示,由字符串表示的字母表。然后“i”代表整数。A 到 i。这是一种方法。另一种方法是了解“atoi”的起源,它显然是“ASCII 到整数”:stackoverflow.com/a/2909772/1544473 (12认同)
  • 遗憾的是,在 UNICODE 时代创建的语言中,Go 的创建者能想到的最好的助记符是“字母到整数”(这是误导性的;十进制数字不是字母字符)或“ASCII- to-Integer”(它已经过时了,有一天很快就会被扔进历史的垃圾箱)。在我看来,“字符到整数”、“字符串到整数”,甚至“Unicode 到整数”都会是更好的助记符。经过反思,他们似乎只是模仿 C 语言约定,其中包括“atoi()”库函数。 (5认同)
  • `strconv` 也可以解释为 _String Convert_ 同样,`Atoi` 有什么含义(扩展名)以便更容易记住吗? (3认同)
  • 另外,也可以执行致命的紧急事件“ panic(err)”。 (2认同)

icz*_*cza 59

转换简单字符串

最简单的方法是使用该strconv.Atoi()功能.

请注意,还有很多其他方法.例如fmt.Sscan(),strconv.ParseInt()它可以提供更大的灵活性,因为您可以指定base和bitsize.另外如以下文档中所述strconv.Atoi():

Atoi是ParseInt(s,10,0)的简写.

这是使用上述功能的一个例子(在Go Playground上试试):

flag.Parse()
s := flag.Arg(0)

if i, err := strconv.Atoi(s); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}

if i, err := strconv.ParseInt(s, 10, 64); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}

var i int
if _, err := fmt.Sscan(s, &i); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}
Run Code Online (Sandbox Code Playgroud)

输出(如果使用参数调用"123"):

i=123, type: int
i=123, type: int64
i=123, type: int
Run Code Online (Sandbox Code Playgroud)

解析自定义字符串

还有一个方便的fmt.Sscanf(),它提供了更大的灵活性,因为格式字符串可以指定数字格式(如宽度,基数等)以及输入中的其他额外字符string.

这非常适合解析包含数字的自定义字符串.例如,如果您的输入是以"id:00123"前缀的形式提供的,"id:"并且数字是固定的5位数,如果更短则用零填充,这很容易解析,如下所示:

s := "id:00123"

var i int
if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil {
    fmt.Println(i) // Outputs 123
}
Run Code Online (Sandbox Code Playgroud)

  • @kaushik94 单击 [`strconv.ParseInt()`](https://golang.org/pkg/strconv/#ParseInt) 链接,您将立即看到:`ParseInt(s string, base int, bitSize int) `. 所以它是基数:_"ParseInt 在给定的基数(2 到 36)中解释字符串 s"_ (2认同)

mae*_*ics 16

以下是将字符串解析为整数的三种方法,从最快的运行时到最慢的:

  1. strconv.ParseInt(...) 最快的
  2. strconv.Atoi(...) 还是很快
  3. fmt.Sscanf(...) 不是非常快,但最灵活

这是一个显示每个函数的用法和示例时间的基准:

package main

import "fmt"
import "strconv"
import "testing"

var num = 123456
var numstr = "123456"

func BenchmarkStrconvParseInt(b *testing.B) {
  num64 := int64(num)
  for i := 0; i < b.N; i++ {
    x, err := strconv.ParseInt(numstr, 10, 64)
    if x != num64 || err != nil {
      b.Error(err)
    }
  }
}

func BenchmarkAtoi(b *testing.B) {
  for i := 0; i < b.N; i++ {
    x, err := strconv.Atoi(numstr)
    if x != num || err != nil {
      b.Error(err)
    }
  }
}

func BenchmarkFmtSscan(b *testing.B) {
  for i := 0; i < b.N; i++ {
    var x int
    n, err := fmt.Sscanf(numstr, "%d", &x)
    if n != 1 || x != num || err != nil {
      b.Error(err)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过保存atoi_test.go并运行来运行它go test -bench=. atoi_test.go.

goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-8      100000000           17.1 ns/op
BenchmarkAtoi-8                 100000000           19.4 ns/op
BenchmarkFmtSscan-8               2000000          693   ns/op
PASS
ok      command-line-arguments  5.797s
Run Code Online (Sandbox Code Playgroud)


MD.*_*san 6

尝试这个

import ("strconv")

value := "123"
number,err := strconv.ParseUint(value, 10, 32)
finalIntNum := int(number) //Convert uint64 To int
Run Code Online (Sandbox Code Playgroud)