パッケージ 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の定数から引用符(", ')を外します。
- 定数
- 変数
- func AppendBool(dst []byte, b bool) []byte
- func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte
- func AppendInt(dst []byte, i int64, base int) []byte
- func AppendQuote(dst []byte, s string) []byte
- func AppendQuoteRune(dst []byte, r rune) []byte
- func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
- func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte
- func AppendQuoteToASCII(dst []byte, s string) []byte
- func AppendQuoteToGraphic(dst []byte, s string) []byte
- func AppendUint(dst []byte, i uint64, base int) []byte
- func Atoi(s string) (int, error)
- func CanBackquote(s string) bool
- func FormatBool(b bool) string
- func FormatFloat(f float64, fmt byte, prec, bitSize int) string
- func FormatInt(i int64, base int) string
- func FormatUint(i uint64, base int) string
- func IsGraphic(r rune) bool
- func IsPrint(r rune) bool
- func Itoa(i int) string
- func ParseBool(str string) (bool, error)
- func ParseFloat(s string, bitSize int) (float64, error)
- func ParseInt(s string, base int, bitSize int) (i int64, err error)
- func ParseUint(s string, base int, bitSize int) (uint64, error)
- func Quote(s string) string
- func QuoteRune(r rune) string
- func QuoteRuneToASCII(r rune) string
- func QuoteRuneToGraphic(r rune) string
- func QuoteToASCII(s string) string
- func QuoteToGraphic(s string) string
- func Unquote(s string) (string, error)
- func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
- type NumError
- func (e *NumError) Error() string
パッケージファイル
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(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(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(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(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(dst []byte, r rune) []byte
AppendQuoteRune は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラル (QuoteRune の返り値) を
dst に追加したバッファを返します。
▾ 例
コード:
b := []byte("rune:")
b = strconv.AppendQuoteRune(b, '☺')
fmt.Println(string(b))
出力:
rune:'☺'
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(dst []byte, r rune) []byte
AppendQuoteRuneToGraphic は, rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラル (QuoteRuneToGraphic の返り値) を
dst に追加したバッファを返します。
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(dst []byte, s string) []byte
AppendQuoteToGraphic は, s を表すダブルクオーテーションマーク(") で囲んだ Go の文字列リテラル (QuoteToGraphic の返り値) を
dst に追加したバッファを返します。
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(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(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(b bool) string
FormatBool は b の値に応じて,"true" あるいは "false" を返します。
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 を返すために必要な最小桁数を使用します。
func FormatInt(i int64, base int) string
FormatInt は base 進数での i の表記を返します。
2 <= base <= 36。 10以上の数字には,
'a' から 'z' までの小文字を用います。
func FormatUint(i uint64, base int) string
FormatUint は base 進数での i の表記を返します。
2 <= base <= 36。 10以上の数字には,
'a' から 'z' までの小文字を用います。
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(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(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(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(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)
}
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(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(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(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(r rune) string
QuoteRune は,rune を表すシングルクオーテーションマーク(') で囲んだ Go の文字リテラルを返します。
制御文字や IsPrint で表示不可能と判定される文字は
Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。
▾ 例
コード:
s := strconv.QuoteRune('☺')
fmt.Println(s)
出力:
'☺'
func QuoteRuneToASCII(r rune) string
QuoteRuneToASCII は, rune を表すシングルクオーテーションマーク(') で囲んだ Go
の文字リテラルを返します。
アスキー文字でない文字や IsGraphic で表示不可能と判定される文字は
Go のエスケープ文字 (\t, \n, \xFF, \u0100) を用います。
▾ 例
コード:
s := strconv.QuoteRuneToASCII('☺')
fmt.Println(s)
出力:
'\u263a'
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(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(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(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'")
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(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\"
NumError は変換失敗を記録します。
type NumError struct {
Func string
Num string
Err error
}
▾ 例
コード:
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