【问题标题】:strconv.ParseInt fails if number starts with 0如果数字以 0 开头,strconv.ParseInt 失败
【发布时间】:2022-01-17 05:23:00
【问题描述】:

我目前在解析 Go 中以 0 开头的一些数字时遇到问题。

fmt.Println(strconv.ParseInt("0491031", 0, 64))

0 strconv.ParseInt:解析“0491031”:语法无效

GoPlayground:https://go.dev/play/p/TAv7IEoyI8I

我认为这是由于一些基本转换错误,但我不知道如何修复它。 如果您需要更多详细信息,我在使用 gocsv 解析 5GB+ csv 文件时遇到此错误。

【问题讨论】:

    标签: go type-conversion


    【解决方案1】:

    引用strconv.ParseInt()

    如果 base 参数为 0,则真正的基数由符号后面的字符串前缀(如果存在)隐含:2 表示“0b”,8 表示“0”或“0o”,16 表示“0x”,以及10 否则。此外,仅对于以 0 为基数的参数,允许使用 Go 语法为整数文字定义的下划线字符。

    您将0 传递给base,因此将从字符串值推断出要解析的基数,并且由于它以'0' 开头,后跟非'0',因此您的数字被解释为八进制 (8) 数字,其中数字 9 无效。

    请注意,这会起作用:

    fmt.Println(strconv.ParseInt("0431031", 0, 64))
    

    然后输出(在Go Playground上试试):

    143897 <nil>
    

    (八进制 431031 等于 143897 十进制。)

    如果您的输入以 10 为底,请将 10 传递给 base

    fmt.Println(strconv.ParseInt("0491031", 10, 64))
    

    然后输出将是(在Go Playground 上尝试):

    491031 <nil>
    

    【讨论】:

    • 如果您期望十进制数据(例如基数为 10 的数据)最好明确设置数据的基数 @Luca。
    • 我真的不知道在问之前我怎么没想到,谢谢!
    • 如果你想要一个int(而不是int64)使用strconv.Atoi(),它是base-10 ParseInt的简写。 pkg.go.dev/strconv#Atoi 这个名字来源于C函数atoi(),其中a代表数组,因为字符串最终是一个字符数组。
    • @Zyl a 代表 ASCII(字符串),i 代表整数。
    • @icza 这更好地出现在教科书中作为坎宁安定律的例子。
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多