Go言語:数値→文字列、文字列→数値変換

Go言語で数値から文字列、文字列から数値に変換する標準ライブラリの関数をまとめました。基本的なパターンは網羅しましたつもりですので、チートシートとして利用してもらえればと思います。
はじめに
Go言語で数値と文字列を変換する関数をまとめました。
Go言語では、このあたりの変換はstrconv
パッケージにまとめられています。
この記事では、strconv
パッケージを使った文字列と数値間の変換関数のうち、よく使うものをサンプルコードと合わせて紹介します。
Go言語の文字列から数値、数値から文字列の変換
Go言語では、文字列と数値の変換にstrconv
パッケージを利用します。以下、主な変換関数です。
int→string
整数を文字列に変換します。
func Itoa(i int) string
package main
import (
"fmt"
"strconv"
)
func main() {
num := 12345
str := strconv.Itoa(num)
fmt.Println(str)
}
string→int
文字列をint
に変換します。変換でerror
が発生した場合は、error
がnil
以外になります。
func Atoi(s string) (int, error)
package main
import (
"fmt"
"strconv"
)
func main() {
s := "123"
v, err := strconv.Atoi(s)
if err != nil {
panic(err)
}
fmt.Println(v)
}
int64→string
base
はn進数を意味していて2~36です。
func FormatInt(i int64, base int) string
package main
import (
"fmt"
"strconv"
)
func main() {
var num int64 = 255
str := strconv.FormatInt(num, 10)
fmt.Println(str)
str = strconv.FormatInt(num, 2)
fmt.Println(str)
str = strconv.FormatInt(num, 16)
fmt.Println(str)
}
string→int64
base
を指定することで文字列をn進数(2~36進数)として入力可能です。base=0
を指定すると、"0b", "0o", "0x"
が接頭文字列としてある場合は2,8,16進数として変換します。
bitSize
は、変換後のbit数(0~64)を指定します。0, 8, 16, 32, 64は、int, int8, int16, int32, int64型に対応します。
変換でerror
が発生した場合は、error
がnil
以外になります。
func ParseInt(s string, base int, bitSize int) (i int64, err error)
package main
import (
"fmt"
"strconv"
)
func main() {
s := "511"
num, err := strconv.ParseInt(s, 10, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
s = "111"
num, err = strconv.ParseInt(s, 2, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
s = "0xff"
num, err = strconv.ParseInt(s, 0, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
}
uint64→string
FormatInt
のuint64
版です。
func FormatUint(i uint64, base int) string
package main
import (
"fmt"
"strconv"
)
func main() {
var num uint64 = 123
str := strconv.FormatUint(num, 10)
fmt.Println(str)
}
string→uint64
func ParseUint(s string, base int, bitSize int) (uint64, error)
package main
import (
"fmt"
"strconv"
)
func main() {
s := "c0"
num, err := strconv.ParseUint(s, 16, 32)
if err != nil {
panic(err)
}
fmt.Println(num)
s = "123"
num, _ = strconv.ParseUint(s, 10, 64)
fmt.Println(num)
}
bool→string
func FormatBool(b bool) string
package main
import (
"fmt"
"strconv"
)
func main() {
flg := true
str := strconv.FormatBool(flg)
fmt.Println(str)
}
string→bool
以下の文字列を論理値に変換します。
変換可能な文字列1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False
func ParseBool(str string) (bool, error)
package main
import (
"fmt"
"strconv"
)
func main() {
s := "TRUE"
str, err := strconv.ParseBool(s)
if err != nil {
panic(err)
}
fmt.Println(str)
}
float64→string
prec
で精度を指定します。bitSize
は32または64で指定したビット数で丸められます。fmt
はフォーマットで意味は下に示します。
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
- ‘b’ (-ddddp±ddd, a binary exponent),
- ‘e’ (-d.dddde±dd, a decimal exponent),
- ‘E’ (-d.ddddE±dd, a decimal exponent),
- ‘f’ (-ddd.dddd, no exponent),
- ‘g’ (‘e’ for large exponents, ‘f’ otherwise),
- ‘G’ (‘E’ for large exponents, ‘f’ otherwise),
- ‘x’ (-0xd.ddddp±ddd, a hexadecimal fraction and binary exponent), or
- ‘X’ (-0Xd.ddddP±ddd, a hexadecimal fraction and binary exponent).
package main
import (
"fmt"
"strconv"
)
func main() {
num := 1.41421356
str := strconv.FormatFloat(num, 'f', 8, 64)
fmt.Println(str)
str = strconv.FormatFloat(num, 'f', 4, 64)
fmt.Println(str)
str = strconv.FormatFloat(num, 'e', 4, 64)
fmt.Println(str)
str = strconv.FormatFloat(num*1000, 'e', 4, 64)
fmt.Println(str)
}
string→float64
bitSize
は32または64で指定したビット数で丸められます
func ParseFloat(s string, bitSize int) (float64, error)
package main
import (
"fmt"
"strconv"
)
func main() {
str := "2.2360679"
num, err := strconv.ParseFloat(str, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
str = "1.3e10"
num, err = strconv.ParseFloat(str, 64)
if err != nil {
panic(err)
}
fmt.Println(num)
}