Golangで文字列を整数に変換したいのですが。しかし、文字列の形式はわかりません。たとえば、_"10"
_-> _10
_、_"65.0"
_-> _65
_、_"xx"
_-> _0
_、 "11xx"-> 11、 " xx11 "-> 0
いくつか検索してstrconv.ParseInt()
を見つけます。ただし、_"65.0"
_は処理できません。文字列の形式を確認する必要があります。
もっと良い方法はありますか?
あなたが探している機能は
strconv.ParseFloat()
例を見る ここ
ただし、この関数の戻り値の型はfloat64です。
文字列として渡される数値の小数部が必要ない場合は、次の関数が機能します。
func StrToInt(str string) (int, error) {
nonFractionalPart := strings.Split(str, ".")
return strconv.Atoi(nonFractionalPart[0])
}
package main
import "strconv"
import "fmt"
// The built-in package "strconv" provides the number parsing.
//For `ParseInt`, the `10` means infer the base from
// the string. `64` requires that the result fit in 64
// bits.
value, err := strconv.ParseInt("123", 10, 64)
if err != nil {
panic(err)
}
fmt.Println(value)
Golangで文字列を整数に変換したいのですが。
すでに述べたように、strconv.ParseInt
これを正確に行う関数!
しかし、文字列の形式はわかりません。
それは恐ろしい(そしてやりがいのある)ように聞こえますが、例を見てみると、形式と問題が次のように示されていることを簡単に理解できます。
文字列の最初の部分を整数として解析するにはどうすればよいですか?
なので strconv.ParseInt
は、構文エラーで0を返します。これは適切ではありません。ええと、少なくとも直接はうまく適合しません。しかし、canは、extractした場合、最初の部分を解析します。あなたはすでにそれを理解していると思いますが、これは本当に最もきれいな解決策です:文字列からコンテンツを抽出し、解析します。
先頭の整数はいくつかの方法で抽出できます。そのうちの1つはregexp
を使用する方法です。
package main
import (
"fmt"
"regexp"
"strconv"
)
// Extract what you need
var leadingInt = regexp.MustCompile(`^[-+]?\d+`)
func ParseLeadingInt(s string) (int64, error) {
s = leadingInt.FindString(s)
if s == "" { // add this if you don't want error on "xx" etc
return 0, nil
}
return strconv.ParseInt(s, 10, 64)
}
func main() {
for _, s := range []string{"10", "65.0", "xx", "11xx", "xx11"} {
i, err := ParseLeadingInt(s)
fmt.Printf("%s\t%d\t%v\n", s, i, err)
}
}
http://play.golang.org/p/d7sS5_WpLj
このコードは単純で、意図が明確に示されていると思います。また、標準のParseInt
を使用しており機能し、必要なすべてのエラーチェックを提供します。
何らかの理由で先頭の整数を抽出する余裕がない場合(テラバイト単位のデータを高速で解析する必要があり、上司が今すぐそれを必要としていることを叫んでいるので、昨日は時間を曲げてそれを届ける:hiss :) ソースコード に飛び込んで標準のパーサーを修正することをお勧めします。構文エラーは報告されませんが、文字列の解析された部分が返されます。
文字列の先頭からintを抽出することは、私が行う最も一般的なことの1つです。 Cでは、atoi()またはstrtol()を使用できます。 Goがそれを行うためのstdライブラリ関数を持たないのはばかげています。とにかくここに私が巻き取ったものがあります:
// strToInt gets the integer from the start of the string.
// It returns the value and the offset of the first non-digit.
func StrToInt(s string) (v int, offset int) {
offset = strings.IndexFunc(s, func(r rune) bool { return r < '0' || r > '9' })
if offset == -1 { offset = len(s) }
if offset == 0 { return } // Avoid Atoi on empty string
v, _ = strconv.Atoi(s[:offset])
return
}
-ve整数を処理する場合は、若干の修正が必要です。
FieldsFunc
を記述して、数値のみを個別に解析および取得できます。
package main
import (
"fmt"
"strconv"
"strings"
"unicode"
)
func stripNonIntFloat(s string) string {
f := func(c rune) bool {
return !unicode.IsNumber(c) && (c != 46)
}
output := strings.FieldsFunc(s, f)
if len(output) > 0 {
return output[0]
} else {
return ""
}
}
func main() {
strList := []string{"10", "65.0", "xx", "11xx", "xx11"}
for i := 0; i < len(strList); i++ {
s := stripNonIntFloat(strList[i])
v, err := strconv.ParseFloat(s, 10)
if err != nil {
fmt.Println(strList[i], 0)
} else {
fmt.Println(strList[i], v)
}
}
}
ここでの出力は
10 10
65.0 65
xx 0
11xx 11
xx11 11
Xx11の最後の条件はそれを11として処理することに注意してください。