【问题标题】:Numbered String to Int with leading zeros带前导零的编号字符串到 Int
【发布时间】:2022-01-23 14:36:01
【问题描述】:

对于编号字符串 (1234),我通常使用包 strconv 和函数 Atoi 在 Go 中从字符串转换为 int。但是,如果编号字符串以前导零开头(例如01234),那么解决此问题的惯用方法是什么?

切片字符串然后将[]string 转换为[]int,是一种方法,但它是最好/惯用的方法吗?

更新 1: 从输入字符串 01234,预期输出 01234 为任何类型的 int(任何类型的简单或组合类型的 int,例如 foo := "01234"bar = []int{0, 1, 2, 3, 4})。

当变量有一个或多个前导零时(例如@ 987654332@ 或 00001)。

更新 2: 只是为了完全清楚,因为我觉得这个问题可以在未来澄清:foo, _ := strconv.Atoi("01234") 返回 1234 作为 int(可以获得相同的结果以其他方式使用strings 包等)。

这里的问题是,我如何(如果可能,在 Go 惯用语中)得到结果 with 前导零,即01234(而不是1234)类型为@ 987654340@?

【问题讨论】:

  • 您的预期输出是多少 - 1234?还是您想以 8 基数处理这个数字?
  • 据我所知,您可以使用带有前导零的strconv.Atoigo.dev/play/p/ZdQI7LGiipf

标签: string go integer


【解决方案1】:
fmt.Printf("%01d ", 5) // 5
fmt.Printf("%02d ", 5) // 05
fmt.Printf("%03d ", 5) // 005
fmt.Printf("%04d ", 5) // 0005

myInt := fmt.Sprintf("%05d ", 5)
fmt.Println(myInt)     // 00005

https://pkg.go.dev/fmt#pkg-overview

【讨论】:

  • 有趣的解决方案 - 你在那里让我几乎很开心,但 myInt 是类型 string 而不是 int。在考虑了这个问题之后,我认为没有任何直接的解决方案不需要字符串对话到符文/字节,做一些业务逻辑然后转换回字符串。考虑它实际上有点奇怪 - 这种情况(即删除任何给定 int 的前导零)存在这个固有问题并且需要转换才能做到这一点。
  • 当你对它们进行一些逻辑处理时,你不需要它们零注意。当你渲染它们时,你不需要它作为 int 类型。
  • 嗯,这取决于。如果您执行诸如计算数字以进行验证之类的操作,并且您依赖于固定长度的字符串,并且您想要使用类型 int,那么您将返回做一些流控制处理由于一个或多个前导零丢失而导致的类型。当然,这不会发生在字符串到字节/符文的转换中,而只会发生在字符串到带有前导零的 int 转换中。
【解决方案2】:

使用strings.TrimLeft(s, "0") 从字符串中删除前导零。

【讨论】:

  • 没有。他想保持零领先
【解决方案3】:

要将十进制字符串转换为这些十进制值的整数切片,请遍历字符串并使用减法将符文转换为相应的整数:

func toIntSlice(s string) ([]int, error) {
    var result []int
    for _, r := range s {
        if r < '0' || r > '9' {
            return nil, fmt.Errorf("not an integer %s", s)
        }
        result = append(result, int(r-'0'))
    }
    return result, nil
}

使用示例:

foo := "01234" 
bar, _ := toIntSlice(foo)
// bar is []int{0, 1, 2, 3, 4}

https://go.dev/play/p/etHtApYoWUi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 2018-01-17
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多