How can I convert string to integer in golang

I want to convert string to integer in golang. But I don't know the format of string. For example, "10" -> 10, "65.0" -> 65, "xx" -> 0, "11xx" -> 11, "xx11"->0

I do some searching and find strconv.ParseInt(). But it can not handle "65.0". So I have to check string's format.

Is there a better way?


I believe function you are looking for is

strconv.ParseFloat()

see example here

But return type of this function is float64.

If you don't need fractional part of the number passed as the string following function would do the job:

func StrToInt(str string) (int, error) {
    nonFractionalPart := strings.Split(str, ".")
    return strconv.Atoi(nonFractionalPart[0])
}

You can use these three functions to convert a string value to an integer or a float. Note : strconv inbuilt package must be imported to execute these functions.

  1. func Atoi(s string) (int, error)

  2. func ParseInt(s string, base int, bitSize int) (i int64, err error)

  3. func ParseFloat(s string, bitSize int) (float64, error)

    package main
    import (
        "fmt"
        "strconv"
    )
    func main() {
        i, _ := strconv.Atoi("-42")
        fmt.Println(i)
    
        j,_ := strconv.ParseInt("-42",10,8)
        fmt.Println(j)
    
        k,_ := strconv.ParseFloat("-42.8",8)
        fmt.Println(k)
    

    }


package main

import "strconv"
import "fmt"

// The built-in package "strconv" provides the number parsing.

// For `ParseInt`, the `0` means infer the base from
// the string. `64` requires that the result fit in 64
// bits.


value, err := strconv.ParseInt("123", 0, 64)
if err != nil {
    panic(err)
}
fmt.Println(value)

For reference, Click Here

You can also pass a non-zero base (like 10) if you always want the same thing.


I want to convert string to integer in golang.

As you've already mentioned, there is a strconv.ParseInt function that does exactly this!

But I don't know the format of string.

That sounds scary (and challenging), but after looking at your examples I can easily conclude you know the format and the problem can be stated like this:

How can I parse an initial portion of a string as an integer?

As strconv.ParseInt returns 0 on syntax error it's not a good fit; well, at least not a good fit directly. But it can parse your initial portion if you extract it. I'm sure you've already figured it out, but this is really the cleanest solution: extract your content from the string, parse it.

You can extract the leading integer in a few ways, one of them is by using regexp:

package main

import (
    "fmt"
    "regexp"
    "strconv"
)

// Extract what you need
var leadingInt = regexp.MustCompile(`^[-+]?\d+`)

func ParseLeadingInt(s string) (int64, error) {
    s = leadingInt.FindString(s)
    if s == "" { // add this if you don't want error on "xx" etc
        return 0, nil
    }
    return strconv.ParseInt(s, 10, 64)
}

func main() {
    for _, s := range []string{"10", "65.0", "xx", "11xx", "xx11"} {
        i, err := ParseLeadingInt(s)
        fmt.Printf("%s\t%d\t%v\n", s, i, err)
    }
}

http://play.golang.org/p/d7sS5_WpLj

I believe this code is simple and clearly demonstrates the intentions. You're also using standard ParseInt which works and gives you all the error checking you need.

If for any reason you can't afford extracting the leading integer (you need it blazing fast parsing terabytes of data and your boss is screaming at you they need it now now now and better yesterday so bend the time and deliver it :hiss:) than I suggest diving into the source code and amending the standard parser so it doesn't report syntax errors, but returns a parsed portion of the string.