programing

이동에서 문자열을 정수 형식으로 변환하시겠습니까?

bestprogram 2023. 4. 22. 10:58

이동에서 문자열을 정수 형식으로 변환하시겠습니까?

반환된 문자열을 변환하려고 합니다.flag.Arg(n)에 대해서int바둑에서 이것을 하는 관용적인 방법은 무엇입니까?

예를 들어,

코드:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "123"

    // string to int
    i, err := strconv.Atoi(s)
    if err != nil {
        // ... handle error
        panic(err)
    }

    fmt.Println(s, i)
}

단순 문자열 변환

가장 쉬운 방법은 기능을 사용하는 것입니다.

그 밖에도 여러 가지 방법이 있습니다.예를 들어 베이스와 비트사이즈를 지정할 수 있기 때문에 유연성이 향상됩니다.또, 다음의 문서에도 기재되어 있습니다.strconv.Atoi():

Atoi는 ParseInt(s, 10, 0)와 동등하며 타입 int로 변환됩니다.

다음은 언급한 기능을 사용하는 예입니다(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)
}

출력(인수를 사용하여 호출된 경우)"123"):

i=123, type: int
i=123, type: int64
i=123, type: int

커스텀 문자열 해석

또한 입력에 추가 문자와 함께 숫자 형식(폭, 베이스 등)을 지정할 수 있어 유연성이 더욱 높아집니다.string.

이것은 번호를 유지하는 커스텀스트링을 해석하는 경우에 편리합니다.예를 들어 입력이 다음 형식으로 제공되는 경우"id:00123"프레픽스가 있는 경우"id:"숫자는 고정 5자리입니다.짧을 경우 0으로 채워집니다.이것은 다음과 같이 쉽게 해석할 수 있습니다.

s := "id:00123"

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

다음으로 스트링을 정수로 해석하는 방법(가장 빠른 런타임부터 가장 느린 런타임까지)을 나타냅니다.

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

다음 이름으로 저장하여 실행할 수 있습니다.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

이거 드셔보세요

import ("strconv")

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

입력 데이터를 제어하면 미니 버전을 사용할 수 있습니다.

package main

import (
    "testing"
    "strconv"
)

func Atoi (s string) int {
    var (
        n uint64
        i int
        v byte
    )   
    for ; i < len(s); i++ {
        d := s[i]
        if '0' <= d && d <= '9' {
            v = d - '0'
        } else if 'a' <= d && d <= 'z' {
            v = d - 'a' + 10
        } else if 'A' <= d && d <= 'Z' {
            v = d - 'A' + 10
        } else {
            n = 0; break        
        }
        n *= uint64(10) 
        n += uint64(v)
    }
    return int(n)
}

func BenchmarkAtoi(b *testing.B) {
    for i := 0; i < b.N; i++ {
        in := Atoi("9999")
        _ = in
    }   
}

func BenchmarkStrconvAtoi(b *testing.B) {
    for i := 0; i < b.N; i++ {
        in, _ := strconv.Atoi("9999")
        _ = in
    }   
}

가장 빠른 옵션(필요한 경우 수표를 작성)결과:

Path>go test -bench=. atoi_test.go
goos: windows
goarch: amd64
BenchmarkAtoi-2                 100000000               14.6 ns/op
BenchmarkStrconvAtoi-2          30000000                51.2 ns/op
PASS
ok      path     3.293s

언급URL : https://stackoverflow.com/questions/4278430/convert-string-to-integer-type-in-go