// 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
}
import (
"strconv"
"strings"
)
func StrToInt(str string) int {
// Delete any non-numeric character from the string
str = strings.TrimFunc(str, func(r rune) bool {
return r < '0' || r > '9'
})
// Convert the cleaned-up string to an integer
n, _ := strconv.Atoi(str)
return n
}
package main
import "strconv"
import "fmt"
// The built-in package "strconv" provides the number parsing.
// For `ParseInt`, the `0` means infer the base from
// the string. `64` requires that the result fit in 64
// bits.
value, err := strconv.ParseInt("123", 0, 64)
if err != nil {
panic(err)
}
fmt.Println(value)
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)
}
}
9条答案
按热度按时间5us2dqdw1#
从一个字符串的开头提取一个int型是我最常做的事情之一,在C语言中你可以使用atoi()或者strtol(),但是Go语言却没有一个std库函数来做这件事,这是很可笑的,不管怎样,这里有一个我刚刚总结出来的函数:
如果你想处理-ve整数,你需要稍微修改一下。
nc1teljy2#
我目前的解决方案是:
pxq42qpu3#
5hcedyr04#
我相信你要找的功能是
参见示例here
但该函数的返回类型为float64。
如果你不需要以字符串形式传递的数字的小数部分,下面的函数可以完成这项工作:
dly7yett5#
可以使用这三个函数将字符串值转换为整数或浮点型。
注意:要执行这些功能,必须导入
strconv
内置包。func Atoi(s string) (int, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseFloat(s string, bitSize int) (float64, error)
cgfeq70w6#
For reference, Click Here
如果总是需要相同的值,也可以传递非零基数(如
10
)。30byixjq7#
我想在golang中将字符串转换为整数。
正如您已经提到的,有一个
strconv.ParseInt
函数可以完成这个任务!但是我不知道字符串的格式。
这听起来很可怕(也很有挑战性),但看过你的例子后,我可以很容易地得出结论,你知道格式,问题可以这样陈述:
因为
strconv.ParseInt
在语法错误时返回0,所以这不是一个很好的匹配;嗯,至少不是一个很好的直接匹配。但是如果你 * 提取 * 它,它 * 可以 * 解析你的初始部分。我相信你已经找到了,但是这确实是最干净的解决方案:从字符串中提取内容,解析它您可以通过几种方式提取前导整数,其中之一是使用
regexp
:http://play.golang.org/p/d7sS5_WpLj
我相信这段代码简单明了,你也使用了标准的
ParseInt
,它可以工作,并提供了你需要的所有错误检查。如果出于任何原因,你无法提取前导整数(你需要它以极快的速度解析TB级的数据,而你的老板却在对你大喊大叫,他们现在就需要它,昨天更好,所以弯曲时间,交付它:hiss:),那么我建议你深入研究源代码,修改标准解析器,使其不报告语法错误,而是返回字符串的解析部分。
6vl6ewon8#
为了补充@MayankPatel和@DeepakG给出的完美答案,可以将字符串设置为各种数值类型。可以将各种数值类型设置为字符串。同样,可以将“true”设置为bool,将
true
设置为字符串。字符串类型表示字符串值的集合。字符串值是一个字节序列(可能为空)。字节数称为字符串的长度,并且决不能为负数。字符串是不可变的。请参阅https://Golang.org/ref/spec#String_types。
下面是将字符串解析为整数的三种方法,从运行时最快到最慢:1. strconv.ParseInt(...)最快2. strconv.Atoi(...)仍然非常快3. fmt.Sscanf(...)不是特别快,但是最灵活。参见https://stackoverflow.com/a/47317150/12817546。
避免将字符串转换为[]byte:B:= []byte(s).它分配一个新的内存空间,并将全部内容复制到其中.参见https://stackoverflow.com/a/52943136/12817546.参见https://stackoverflow.com/a/41460993/12817546.引文编辑
sczxawaw9#
您可以编写一个
FieldsFunc
来单独解析和获取数字值。Play it here
此处的输出为
请注意,xx11的最后一个条件将其作为11处理。