...

パッケージ 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 converts the floating-point number f to a string, according to the format fmt and precision prec. It rounds the result assuming that the original was obtained from a floating-point value of bitSize bits (32 for float32, 64 for float64).

The format fmt is one of '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).

The precision prec controls the number of digits (excluding the exponent) printed by the 'e', 'E', 'f', 'g', 'G', 'x', and 'X' formats. For 'e', 'E', 'f', 'x', and 'X', it is the number of digits after the decimal point. For 'g' and 'G' it is the maximum number of significant digits (trailing zeros are removed). The special precision -1 uses the smallest number of digits necessary such that ParseFloat will return f exactly.

コード:

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 converts the string s to a floating-point number with the precision specified by bitSize: 32 for float32, or 64 for float64. When bitSize=32, the result still has type float64, but it will be convertible to float32 without changing its value.

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

The errors that ParseFloat returns have concrete type *NumError and include err.Num = s.

If s is not syntactically well-formed, ParseFloat returns err.Err = ErrSyntax.

If s is syntactically well-formed but is more than 1/2 ULP away from the largest floating point number of the given size, ParseFloat returns f = ±Inf, err.Err = ErrRange.

ParseFloat recognizes the strings "NaN", "+Inf", and "-Inf" as their respective special floating point values. It ignores case when matching.

コード:

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 is case insensitive
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 interprets a string s in the given base (0, 2 to 36) and bit size (0 to 64) and returns the corresponding value i.

If the base argument is 0, the true base is implied by the string's prefix: 2 for "0b", 8 for "0" or "0o", 16 for "0x", and 10 otherwise. Also, for argument base 0 only, underscore characters are permitted as defined by the Go syntax for integer literals.

The bitSize argument specifies the integer type that the result must fit into. Bit sizes 0, 8, 16, 32, and 64 correspond to int, int8, int16, int32, and int64. If bitSize is below 0 or above 64, an error is returned.

The errors that ParseInt returns have concrete type *NumError and include err.Num = s. If s is empty or contains invalid digits, err.Err = ErrSyntax and the returned value is 0; if the value corresponding to s cannot be represented by a signed integer of the given size, err.Err = ErrRange and the returned value is the maximum magnitude integer of the appropriate bitSize and sign.

コード:

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 の文字列リテラルと解釈し,returning the string value 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