Go: convert strings in array to integer

huangapple go评论126阅读模式
英文:

Go: convert strings in array to integer

问题

如何在Go中将数组中的字符串转换为整数数组?

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. strArray := []string{"1", "2", "3"}
  8. intArray := make([]int, len(strArray))
  9. for i, v := range strArray {
  10. num, err := strconv.Atoi(v)
  11. if err != nil {
  12. fmt.Printf("Error converting string to integer: %v\n", err)
  13. return
  14. }
  15. intArray[i] = num
  16. }
  17. fmt.Println(intArray)
  18. }

在上面的示例中,我们使用strconv.Atoi()函数将字符串转换为整数。我们首先创建一个与字符串数组相同长度的整数数组intArray。然后,我们使用range循环遍历字符串数组,并在每次迭代中将字符串转换为整数,并将其存储在整数数组中的相应位置。最后,我们打印整数数组。

希望这可以帮助到你!

英文:

How do I convert strings in an array to integers in an array in go?

  1. ["1", "2", "3"]

to

  1. [1, 2, 3]

I've searched for some solutions online but couldn't find it. I've tried to loop through the array and did strconv.ParseFloat(v, 64) where v is the value but it didn't work.

答案1

得分: 40

你确实需要遍历切片。如果切片只包含整数,就不需要使用ParseFloat,只需要使用Atoi即可。

  1. import "fmt"
  2. import "strconv"
  3. func main() {
  4. var t = []string{"1", "2", "3"}
  5. var t2 = []int{}
  6. for _, i := range t {
  7. j, err := strconv.Atoi(i)
  8. if err != nil {
  9. panic(err)
  10. }
  11. t2 = append(t2, j)
  12. }
  13. fmt.Println(t2)
  14. }

Playground上可以运行。

英文:

You will have to loop through the slice indeed. If the slice only contains integers, no need of ParseFloat, Atoi is sufficient.

  1. import "fmt"
  2. import "strconv"
  3. func main() {
  4. var t = []string{"1", "2", "3"}
  5. var t2 = []int{}
  6. for _, i := range t {
  7. j, err := strconv.Atoi(i)
  8. if err != nil {
  9. panic(err)
  10. }
  11. t2 = append(t2, j)
  12. }
  13. fmt.Println(t2)
  14. }

On Playground.

答案2

得分: 11

例如,

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func sliceAtoi(sa []string) ([]int, error) {
  7. si := make([]int, 0, len(sa))
  8. for _, a := range sa {
  9. i, err := strconv.Atoi(a)
  10. if err != nil {
  11. return si, err
  12. }
  13. si = append(si, i)
  14. }
  15. return si, nil
  16. }
  17. func main() {
  18. sa := []string{"1", "2", "3"}
  19. si, err := sliceAtoi(sa)
  20. if err != nil {
  21. fmt.Println(err)
  22. return
  23. }
  24. fmt.Printf("%q %v\n", sa, si)
  25. }

输出:

  1. ["1" "2" "3"] [1 2 3]

Playground:

http://play.golang.org/p/QwNO8R_f90

英文:

For example,

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func sliceAtoi(sa []string) ([]int, error) {
  7. si := make([]int, 0, len(sa))
  8. for _, a := range sa {
  9. i, err := strconv.Atoi(a)
  10. if err != nil {
  11. return si, err
  12. }
  13. si = append(si, i)
  14. }
  15. return si, nil
  16. }
  17. func main() {
  18. sa := []string{"1", "2", "3"}
  19. si, err := sliceAtoi(sa)
  20. if err != nil {
  21. fmt.Println(err)
  22. return
  23. }
  24. fmt.Printf("%q %v\n", sa, si)
  25. }

Output:

  1. ["1" "2" "3"] [1 2 3]

Playground:

http://play.golang.org/p/QwNO8R_f90

答案3

得分: 4

这是一个古老的问题,但是所有的答案都忽略了输入长度事先已知的事实,因此可以通过预先分配目标切片来改进:

  1. package main
  2. import "fmt"
  3. import "strconv"
  4. func main() {
  5. var t = []string{"1", "2", "3"}
  6. var t2 = make([]int, len(t))
  7. for idx, i := range t {
  8. j, err := strconv.Atoi(i)
  9. if err != nil {
  10. panic(err)
  11. }
  12. t2[idx] = j
  13. }
  14. fmt.Println(t2)
  15. }

Playground: https://play.golang.org/p/LBKnVdi_1Xz

英文:

This is an ancient question but all the answers ignore the fact that the input length is known in advance, so it can be improved by pre-allocating the destination slice:

  1. package main
  2. import "fmt"
  3. import "strconv"
  4. func main() {
  5. var t = []string{"1", "2", "3"}
  6. var t2 = make([]int, len(t))
  7. for idx, i := range t {
  8. j, err := strconv.Atoi(i)
  9. if err != nil {
  10. panic(err)
  11. }
  12. t2[idx] = j
  13. }
  14. fmt.Println(t2)
  15. }

Playground: https://play.golang.org/p/LBKnVdi_1Xz

答案4

得分: 1

一个切片是数组段的描述符
它由以下部分组成:

  • 数组的指针,
  • 段的长度,
  • 容量(段的最大长度)

下面,将字符串数组/切片转换为整数数组/切片:

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "strings"
  7. )
  8. func Slice_Atoi(strArr []string) ([]int, error) {
  9. // 注意:按您喜欢的方式将Arr读取为Slice
  10. var str string // O
  11. var i int // O
  12. var err error // O
  13. iArr := make([]int, 0, len(strArr))
  14. for _, str = range strArr {
  15. i, err = strconv.Atoi(str)
  16. if err != nil {
  17. return nil, err // O
  18. }
  19. iArr = append(iArr, i)
  20. }
  21. return iArr, nil
  22. }
  23. func main() {
  24. strArr := []string{
  25. "0 0 24 3 15",
  26. "0 0 2 5 1 5 11 13",
  27. }
  28. for i := 0; i < len(strArr); i++ {
  29. iArr, err := Slice_Atoi(strings.Split(strArr[i], " "))
  30. if err != nil {
  31. log.Print("Slice_Atoi failed: ", err)
  32. return
  33. }
  34. fmt.Println(iArr)
  35. }
  36. }

输出:

  1. [0 0 24 3 15]
  2. [0 0 2 5 1 5 11 13]

我在项目中使用了这段代码,并从其他回答中进行了一些小的优化,用 // O 标记了上面的部分,并对可读性进行了一些修复。

祝你好运!

英文:

A slice is a descriptor of an array segment
It consists of

  • a pointer to the array,
  • the length of the segment, and
  • its capacity (the maximum length of the segment)

Below, string Array/Slice is converted to int Array/Slice:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;log&quot;
  5. &quot;strconv&quot;
  6. &quot;strings&quot;
  7. )
  8. func Slice_Atoi(strArr []string) ([]int, error) {
  9. // NOTE: Read Arr as Slice as you like
  10. var str string // O
  11. var i int // O
  12. var err error // O
  13. iArr := make([]int, 0, len(strArr))
  14. for _, str = range strArr {
  15. i, err = strconv.Atoi(str)
  16. if err != nil {
  17. return nil, err // O
  18. }
  19. iArr = append(iArr, i)
  20. }
  21. return iArr, nil
  22. }
  23. func main() {
  24. strArr := []string{
  25. &quot;0 0 24 3 15&quot;,
  26. &quot;0 0 2 5 1 5 11 13&quot;,
  27. }
  28. for i := 0; i &lt; len(strArr); i++ {
  29. iArr, err := Slice_Atoi(strings.Split(strArr[i], &quot; &quot;))
  30. if err != nil {
  31. log.Print(&quot;Slice_Atoi failed: &quot;, err)
  32. return
  33. }
  34. fmt.Println(iArr)
  35. }
  36. }

Output:

  1. [0 0 24 3 15]
  2. [0 0 2 5 1 5 11 13]

I used in a project, so did a small optimizations from other replies, marked as // O for above, also fixed a bit in readability for others

Best of luck

答案5

得分: 0

这是另一个示例,演示如何完成这个任务:

  1. var t = []string{"1", "2", "3"}
  2. str := strings.Join(t, "")
  3. if _, err := strconv.Atoi(str); err != nil {
  4. // 如果str无法转换为整数,执行相应操作
  5. }
  6. var slice []int // 空切片
  7. for _, digit := range str {
  8. slice = append(slice, int(digit)-int('0')) // 构建切片
  9. }

我喜欢这个方法,因为你只需要检查一次t中的每个数字是否可以转换为整数。这样更有效率吗?我不知道。

为什么需要int('0')?因为int()会将字符转换为对应的ASCII码(ASCII码表在这里)。对于数字0,对应的ASCII码是48。所以你需要从你的数字在"ASCII十进制"中对应的值中减去48。

英文:

Here is another example how to do this:

  1. var t = []string{&quot;1&quot;, &quot;2&quot;, &quot;3&quot;}
  2. str := strings.Join(t, &quot;&quot;)
  3. if _, err := strconv.Atoi(str); err != nil {
  4. // do stuff, in case str can not be converted to an int
  5. }
  6. var slice []int // empty slice
  7. for _, digit := range str {
  8. slice = append(slice, int(digit)-int(&#39;0&#39;)) // build up slice
  9. }

I like this because you have to check only once if each digit inside of t can be converted to an int. Is it more efficient? I don`t know.

Why do you need the int(&#39;0&#39;)? Because int() will convert the character to the corresponding ASCII code (ascii table here). For 0 that would be 48. So you will have to substract 48 from whatever your digit corresponds to in "ascii decimal".

huangapple
  • 本文由 发表于 2014年7月27日 00:11:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/24972950.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定