...

パッケージ strconv

import "strconv"
概要
目次

概要 ▾

strconv パッケージは基本的な型の文字列表現への 変換関数を提供します。

数字変換

最も基本的な数字変換関数は Atoi (文字列から整数) と Itoa (整数から文字列)です。

i, err := strconv.Atoi ("-42")
s := strconv.Itoa (-42)

これらの関数では10進数の数字とGoのint型が使われています。

ParseBool, ParseFloat, ParseInt, ParseUint は文字列から値に変換します。

b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)

これらの変換関数は最も大きな型(float64, int64, uint64)を返しますが, size引数でより小さなビット数を指定すれば, データを切り捨てることなくそのビット数の型に変換することができます。

s := "2147483647" // int32 の最大値
i64, err := strconv.ParseInt(s, 10, 32)
...
i := int32(i64)

FormatBool, FormatFloat, FormatInt, FormatUint は値を文字列に変換します。

s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)

AppendBool, AppendFloat, AppendInt, AppendUint はスライスにフォーマットされた文字列を追加します。

文字列変換

Quote と QuoteToASCII は文字列を引用符(")で囲まれたGOの文字列定数に変換します。 QuoteToASCII はASCIIでないUnicode文字を\uで始まる値に置き換えるため, 返り値はすべてASCII文字列となります。

q := strconv.Quote("Hello, 世界")
q := strconv.QuoteToASCII("Hello, 世界")

QuoteRune と QuoteRuneToASCII は runeを引数に取り,引用符(')で囲まれたGo rune 定数を返します。

Unquote と UnquoteChar は Goの文字列とruneの定数から引用符(", ')を外します。

目次 ▾

パッケージファイル

atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go

定数

IntSize は int あるいは uint 型の値のビット数です。

const IntSize = intSize

変数

ErrRange は値が変換先の型の範囲外であることを示します。

var ErrRange = errors.New("value out of range")

ErrSyntax は,値が変換先の型に合わない形式であることを示します。

var ErrSyntax = errors.New("invalid syntax")

func AppendBool

func AppendBool(dst []byte, b bool) []byte

AppendBool は b の値に応じて "true" あるいは "false" を dstに追加したバッファを返します。

コード:

b := []byte("bool:")
b = strconv.AppendBool(b, true)
fmt.Println(string(b))

出力:

bool:true

func AppendFloat

func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte

AppendFloat は,浮動小数 f を FormatFloat でフォーマットした文字列 を dst に追加し,その追加されたバッファを返します。

コード:

b32 := []byte("float32:")
b32 = strconv.AppendFloat(b32, 3.1415926535, 'E', -1, 32)
fmt.Println(string(b32))

b64 := []byte("float64:")
b64 = strconv.AppendFloat(b64, 3.1415926535, 'E', -1, 64)
fmt.Println(string(b64))

出力:

float32:3.1415927E+00
float64:3.1415926535E+00

func AppendInt

func AppendInt(dst []byte, i int64, base int) []byte

AppendInt は FormatInt での整数 i の文字列表現を dst に追加したバッファを返します。

コード:

b10 := []byte("int (base 10):")
b10 = strconv.AppendInt(b10, -42, 10)
fmt.Println(string(b10))

b16 := []byte("int (base 16):")
b16 = strconv.AppendInt(b16, -42, 16)
fmt.Println(string(b16))

出力:

int (base 10):-42
int (base 16):-2a

func AppendQuote

func AppendQuote(dst []byte, s string) []byte

AppendQuote は, s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラル (Quote の返り値) を dst に追加したバッファを返します。

コード:

b := []byte("quote:")
b = strconv.AppendQuote(b, `"Fran & Freddie's Diner"`)
fmt.Println(string(b))

出力:

quote:"\"Fran & Freddie's Diner\""

func AppendQuoteRune

func AppendQuoteRune(dst []byte, r rune) []byte

AppendQuoteRune は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラル (QuoteRune の返り値) を dst に追加したバッファを返します。

コード:

b := []byte("rune:")
b = strconv.AppendQuoteRune(b, '☺')
fmt.Println(string(b))

出力:

rune:'☺'

func AppendQuoteRuneToASCII

func AppendQuoteRuneToASCII(dst []byte, r rune) []byte

AppendQuoteRuneToASCII は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラル (QuoteRuneToASCII の返り値) を dst に追加したバッファを返します。

コード:

b := []byte("rune (ascii):")
b = strconv.AppendQuoteRuneToASCII(b, '☺')
fmt.Println(string(b))

出力:

rune (ascii):'\u263a'

func AppendQuoteRuneToGraphic 1.6

func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte

AppendQuoteRuneToGraphic は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラル (QuoteRuneToGraphic の返り値) を dst に追加したバッファを返します。

func AppendQuoteToASCII

func AppendQuoteToASCII(dst []byte, s string) []byte

AppendQuoteToASCII は, s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラル (QuoteToASCII の返り値) を dst に追加したバッファを返します。

コード:

b := []byte("quote (ascii):")
b = strconv.AppendQuoteToASCII(b, `"Fran & Freddie's Diner"`)
fmt.Println(string(b))

出力:

quote (ascii):"\"Fran & Freddie's Diner\""

func AppendQuoteToGraphic 1.6

func AppendQuoteToGraphic(dst []byte, s string) []byte

AppendQuoteToGraphic は, s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラル (QuoteToGraphic の返り値) を dst に追加したバッファを返します。

func AppendUint

func AppendUint(dst []byte, i uint64, base int) []byte

AppendUint は FormatUint での整数 i の文字列表現を dst に追加したバッファを返します。

コード:

b10 := []byte("uint (base 10):")
b10 = strconv.AppendUint(b10, 42, 10)
fmt.Println(string(b10))

b16 := []byte("uint (base 16):")
b16 = strconv.AppendUint(b16, 42, 16)
fmt.Println(string(b16))

出力:

uint (base 10):42
uint (base 16):2a

func Atoi

func Atoi(s string) (int, error)

Atoi は ParseInt(s, 10, 0) の返り値をint型に変換した関数です。

コード:

v := "10"
if s, err := strconv.Atoi(v); err == nil {
    fmt.Printf("%T, %v", s, s)
}

出力:

int, 10

func CanBackquote

func CanBackquote(s string) bool

CanBackquote は,文字列 s にタブ以外の制御文字がなく,文字列を変えずにバッククオーテーションマーク (`) で囲むことにより, 1行の文字列で 表せるかどうかを返します。

コード:

fmt.Println(strconv.CanBackquote("Fran & Freddie's Diner ☺"))
fmt.Println(strconv.CanBackquote("`can't backquote this`"))

出力:

true
false

func FormatBool

func FormatBool(b bool) string

FormatBool は b の値に応じて,"true" あるいは "false" を返します。

コード:

v := true
s := strconv.FormatBool(v)
fmt.Printf("%T, %v\n", s, s)

出力:

string, true

func FormatFloat

func FormatFloat(f float64, fmt byte, prec, bitSize int) string

FormatFloat はフォーマットfmtと精度precにしたがって浮動小数fを文字列に変換します。 もとの値はbitSizeビット(32はfloat32, 64はfloat64)の浮動小数 であるとして 値を丸めます。

フォーマット fmt には以下のうち一つを指定します。 'b' (-ddddp±ddd, 2の累乗), 'e' (-d.dddde±dd, 10の累乗), 'E' (-d.ddddE±dd, 10の累乗), 'f' (-ddd.dddd, 累乗なし), 'g' (大きい累乗の場合 'e', そうでない場合 'f'), 'G' (大きい累乗の場合 'E', そうでない場合 'f'), 'x' (-0xd.ddddp±ddd, 16 進小数と 2 進指数), or 'X' (-0Xd.ddddP±ddd, 16 進小数と 2 進指数).

精度 prec は, "e" , "E" , "f" , "g" , "G" , "x" ,および "X" 形式で出力される桁数 (指数を除く) を制御します。 "e" , "E" , "f" , "x" ,および "X" の場合,小数点以下の桁数です。 "g" および "G" の場合,有効桁の最大数です (末尾のゼロは削除されます) 。特別な精度 -1 は, ParseFloat が正確に f を返すために必要な最小桁数を使用します。

コード:

v := 3.1415926535

s32 := strconv.FormatFloat(v, 'E', -1, 32)
fmt.Printf("%T, %v\n", s32, s32)

s64 := strconv.FormatFloat(v, 'E', -1, 64)
fmt.Printf("%T, %v\n", s64, s64)

出力:

string, 3.1415927E+00
string, 3.1415926535E+00

func FormatInt

func FormatInt(i int64, base int) string

FormatInt は base 進数での i の表記を返します。 2 <= base <= 36。 10以上の数字には, 'a' から 'z' までの小文字を用います。

コード:

v := int64(-42)

s10 := strconv.FormatInt(v, 10)
fmt.Printf("%T, %v\n", s10, s10)

s16 := strconv.FormatInt(v, 16)
fmt.Printf("%T, %v\n", s16, s16)

出力:

string, -42
string, -2a

func FormatUint

func FormatUint(i uint64, base int) string

FormatUint は base 進数での i の表記を返します。 2 <= base <= 36。 10以上の数字には, 'a' から 'z' までの小文字を用います。

コード:

v := uint64(42)

s10 := strconv.FormatUint(v, 10)
fmt.Printf("%T, %v\n", s10, s10)

s16 := strconv.FormatUint(v, 16)
fmt.Printf("%T, %v\n", s16, s16)

出力:

string, 42
string, 2a

func IsGraphic 1.6

func IsGraphic(r rune) bool

IsGraphic は,rune が Unicode で Graphic と定義されているかを返します。 Graphic である rune には,文字,記号,数字,句読点,シンボル, 空白,カテゴリー L, M, N, P, S, Zs に含まれる文字が含まれます。

コード:

shamrock := strconv.IsGraphic('☘')
fmt.Println(shamrock)

a := strconv.IsGraphic('a')
fmt.Println(a)

bel := strconv.IsGraphic('\007')
fmt.Println(bel)

出力:

true
true
false

func IsPrint

func IsPrint(r rune) bool

IsPrint は,rune が Go で表示可能と定義されているかどうかを返します。 unicode.IsPrint と同じ定義であり,表示可能な rune は,文字,数字,句読点, シンボル,アスキースペースです。

コード:

c := strconv.IsPrint('\u263a')
fmt.Println(c)

bel := strconv.IsPrint('\007')
fmt.Println(bel)

出力:

true
false

func Itoa

func Itoa(i int) string

Itoa は FormatInt(int64(i), 10) と同じです。

コード:

i := 10
s := strconv.Itoa(i)
fmt.Printf("%T, %v\n", s, s)

出力:

string, 10

func ParseBool

func ParseBool(str string) (bool, error)

ParseBool は文字列によって表された真偽値を返します。 判別できるのは,1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False です。 それ以外の文字列はエラーとなります。

コード:

v := "true"
if s, err := strconv.ParseBool(v); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}

出力:

bool, true

func ParseFloat

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

ParseFloat は文字列sを浮動小数に変換します。 bitSize が 32 なら float32, 64 なら float64 の精度で変換します。 bitSize=32 の場合,返り値の型はfloat64ですが, 値を変えることなく,float32に変換することができます。

ParseFloat accepts decimal and hexadecimal floating-point number syntax. If s is well-formed and near a valid floating-point number, ParseFloat returns the nearest floating-point number rounded using IEEE754 unbiased rounding. (Parsing a hexadecimal floating-point value only rounds when there are more bits in the hexadecimal representation than will fit in the mantissa.)

ParseFloat の返すエラーの型は *NumError で, err.Num = s となります。

s が正しい形式でない場合,ParseFloatが返すエラーは err.Err = ErrSyntax となります。

s の構文が整形式であるが,指定されたサイズの最大浮動小数点数から 1/2 ULP 以上離れている場合, ParseFloat は f =± Inf , err.Err = ErrRange を返します。

ParseFloat は,文字列 "NaN", "+Inf" ,および "-Inf" をそれぞれの特別な浮動小数点値として認識します。一致する場合,大文字と小文字を区別しません。

コード:

v := "3.1415926535"
if s, err := strconv.ParseFloat(v, 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat(v, 64); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("NaN", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
// ParseFloat は大文字小文字を区別しません
if s, err := strconv.ParseFloat("nan", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("inf", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("+Inf", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("-Inf", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("-0", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseFloat("+0", 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}

出力:

float64, 3.1415927410125732
float64, 3.1415926535
float64, NaN
float64, NaN
float64, +Inf
float64, +Inf
float64, -Inf
float64, -0
float64, 0

func ParseInt

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

ParseInt は,指定されたベース (0 , 2~36) およびビットサイズ (0~64) の文字列 s を解釈し,対応する値 i を返します。

If base == 0, the base is implied by the string's prefix: base 2 for "0b", base 8 for "0" or "0o", base 16 for "0x", and base 10 otherwise. Also, for base == 0 only, underscore characters are permitted per the Go integer literal syntax. If base is below 0, is 1, or is above 36, an error is returned.

bitSize 引数は,結果が収まらなければならない整数型を指定します。ビットサイズ 0, 8, 16, 32 ,および 64 は, int, int8, int16, int32 ,および int64 に対応します。 bitSize が 0 未満または 64 を超える場合,エラーが返されます。

ParseInt が返すエラーは具象型 *NumError を持ち, err.Num = s を含みます。 s が空であるか,無効な数字が含まれている場合, err.Err = ErrSyntax で戻り値は 0 です。 s に対応する値が指定されたサイズの符号付き整数で表現できない場合, err.Err = ErrRange で,返される値は適切な bitSize と符号の最大の整数です。

コード:

v32 := "-354634382"
if s, err := strconv.ParseInt(v32, 10, 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseInt(v32, 16, 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}

v64 := "-3546343826724305832"
if s, err := strconv.ParseInt(v64, 10, 64); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseInt(v64, 16, 64); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}

出力:

int64, -354634382
int64, -3546343826724305832

func ParseUint

func ParseUint(s string, base int, bitSize int) (uint64, error)

ParseUint は ParseInt の uint 版です。

コード:

v := "42"
if s, err := strconv.ParseUint(v, 10, 32); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}
if s, err := strconv.ParseUint(v, 10, 64); err == nil {
    fmt.Printf("%T, %v\n", s, s)
}

出力:

uint64, 42
uint64, 42

func Quote

func Quote(s string) string

Quote は s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラルを返します。 制御文字や IsPrint で表示不可能と判定される文字は, Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.Quote(`"Fran & Freddie's Diner	☺"`) // 文字列リテラル中にタブ文字があります
fmt.Println(s)

出力:

"\"Fran & Freddie's Diner\t☺\""

func QuoteRune

func QuoteRune(r rune) string

QuoteRune は,rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラルを返します。 制御文字や IsPrint で表示不可能と判定される文字は Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.QuoteRune('☺')
fmt.Println(s)

出力:

'☺'

func QuoteRuneToASCII

func QuoteRuneToASCII(r rune) string

QuoteRuneToASCII は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラルを返します。 アスキー文字でない文字や IsGraphic で表示不可能と判定される文字は Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.QuoteRuneToASCII('☺')
fmt.Println(s)

出力:

'\u263a'

func QuoteRuneToGraphic 1.6

func QuoteRuneToGraphic(r rune) string

QuoteRuneToGraphic は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラルを返します。 アスキー文字でない文字や IsGraphic で表示不可能と判定される文字は Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.QuoteRuneToGraphic('☺')
fmt.Println(s)

s = strconv.QuoteRuneToGraphic('\u263a')
fmt.Println(s)

s = strconv.QuoteRuneToGraphic('\u000a')
fmt.Println(s)

s = strconv.QuoteRuneToGraphic('	') // タブ文字
fmt.Println(s)

出力:

'☺'
'☺'
'\n'
'\t'

func QuoteToASCII

func QuoteToASCII(s string) string

QuoteToASCII は s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラルを返します。 アスキー文字でない文字や IsPrint で表示不可能と判定される文字は Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.QuoteToASCII(`"Fran & Freddie's Diner	☺"`) // 文字列リテラル中にタブ文字があります
fmt.Println(s)

出力:

"\"Fran & Freddie's Diner\t\u263a\""

func QuoteToGraphic 1.6

func QuoteToGraphic(s string) string

QuoteToGraphic は, s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラルを返します。 アスキー文字でない文字や IsGraphic で表示不可能と判定される文字は Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。

コード:

s := strconv.QuoteToGraphic("☺")
fmt.Println(s)

s = strconv.QuoteToGraphic("This is a \u263a	\u000a") // 文字列リテラル中にタブ文字があります
fmt.Println(s)

s = strconv.QuoteToGraphic(`" This is a ☺ \n "`)
fmt.Println(s)

出力:

"☺"
"This is a ☺\t\n"
"\" This is a ☺ \\n \""

func Unquote

func Unquote(s string) (string, error)

Unquote は, s をシングルクオーテーション,ダブルクオーテーション, バッククオーテーションを用いた Go の文字列リテラルと解釈し, s が囲んでいる文字列を返します。 s がシングルクオーテーションで囲まれているなら,Unquote は 1 文字からなる文字列を返します。

コード:

s, err := strconv.Unquote("You can't unquote a string without quotes")
fmt.Printf("%q, %v\n", s, err)
s, err = strconv.Unquote("\"The string must be either double-quoted\"")
fmt.Printf("%q, %v\n", s, err)
s, err = strconv.Unquote("`or backquoted.`")
fmt.Printf("%q, %v\n", s, err)
s, err = strconv.Unquote("'\u263a'") // シングルクオート(')の中は1つの文字
fmt.Printf("%q, %v\n", s, err)
s, err = strconv.Unquote("'\u2639\u2639'")
fmt.Printf("%q, %v\n", s, err)

出力:

"", invalid syntax
"The string must be either double-quoted", <nil>
"or backquoted.", <nil>
"☺", <nil>
"", invalid syntax

func UnquoteChar

func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)

UnquoteChar は,文字列 s によって表されるエスケープ文字列あるいは文字リテラルの最初の文字あるいはバイトを デコードします。 次の 4 つの値を返します。

1) value, デコードされた Unicode コードポイントあるいはバイト値
2) multibyte, デコードされた文字がマルチバイト UTF-8 で表す必要があるかを示す真偽値
3) tail, その文字の後の文字列
4) err, 文字が有効なら nil

2 番目の引数 quote は,解析するリテラルの種類を指定し, どのエスケープ文字が許可されているかを指定します。 シングルクオーテーション (') を設定すると, \' を許可し,エスケープされていない ' を許可しません。 ダブルクオーテーション (") を設定すると, \" を許可し,エスケープされていない " を許可しません。 ゼロを設定すると,どちらのエスケープも許可せず,どちらの引用符もエスケープされずに出てくることができます。

コード:

v, mb, t, err := strconv.UnquoteChar(`\"Fran & Freddie's Diner\"`, '"')
if err != nil {
    log.Fatal(err)
}

fmt.Println("value:", string(v))
fmt.Println("multibyte:", mb)
fmt.Println("tail:", t)

出力:

value: "
multibyte: false
tail: Fran & Freddie's Diner\"

type NumError

NumError は変換失敗を記録します。

type NumError struct {
    Func string // 失敗した関数 (ParseBool, ParseInt, ParseUint, ParseFloat)
    Num  string // 入力
    Err  error  // 変換が失敗した理由 (ErrRange, ErrSyntax, 等)
}

コード:

str := "Not a number"
if _, err := strconv.ParseFloat(str, 64); err != nil {
    e := err.(*strconv.NumError)
    fmt.Println("Func:", e.Func)
    fmt.Println("Num:", e.Num)
    fmt.Println("Err:", e.Err)
    fmt.Println(err)
}

出力:

Func: ParseFloat
Num: Not a number
Err: invalid syntax
strconv.ParseFloat: parsing "Not a number": invalid syntax

func (*NumError) Error

func (e *NumError) Error() string