きっかけ
codewarsで出題される問題に文字列->数値の変換を求められる問題があるので調べてみると、strconvが見つかるが途中で文字列が入った場合などのエラー集が見つからなかったので自分で調べてみた。
文字列<->数値するライブラリstrconv
調べると、日本語で翻訳された以下のサイトが出てくる
golang.jp
こちらはサイトにも書いてある通り、古い翻訳になっている為strconvから削除されているものも載っている
例えば、文字列->floatを行うAtof関数などは現在の公式のドキュメントでは記載されていない為、コンパイルしても通らないので、注意が必要です。
試した事
文字列内に数字以外の文字が入った場合の返り値はどうなっているか
プレイグラウンドはこちらから
import (
“fmt”
“strconv”
)
func main() {
//先頭文字列はエラーと0
var a = “as123445”
b, b_err := strconv.Atoi(a)
fmt.Println(a, b, b_err)
//文字列の途中挿入はエラーと0
a = “1234as45”
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//最後が文字列はエラーと0
a = “123445as”
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//int型なので小数点はエラーと0
a = “1.2345”
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//空白もエラーと0
a = “- 123″
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//空白もエラーと0
a = ” -123″
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//正しい
a = “-123”
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//正しい
a = “123”
b, b_err = strconv.Atoi(a)
fmt.Println(a, b, b_err)
//rune型はできない
//c := ‘1’
//b, b_err = strconv.Atoi(c)
//fmt.Println(a, b, b_err)
//無くなってる
//float_value := “1.2345”
//float_value,_ := strconv.Atof(floatstring)
}
結論
文字列や空白があると問答無用出エラーにする
言語によっては文字列までの数字を返すなどがあるがここまで潔いと処理は考えやすいかと感じた。
残念なこと
残念ながら現在の公式のドキュメントを見る限り、floatにはもう対応していない様子である
文字列中で小数点を見つけて分割するという必要があるかもしれない・・・
最後に
golang.jpは日本語訳で基本的には変わらずに使えるのでかなり助かります
しかし、うまくいかなかった場合はちゃんと公式のドキュメントを読みましょう