将字符串转换为整数(如果转换不成功则抛出错误)

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

Convert from string to int (and throw error if unsuccessful)

问题

对不起,如果这是一个初学者问题,但我似乎找不到任何解决方案。我正在尝试接受一个根据上下文可以是stringint的参数,并且我需要确定它是哪种类型(然后将其转换为int,如果它确实是那种类型)。

谢谢 将字符串转换为整数(如果转换不成功则抛出错误)

英文:

My apologies if this is a beginner question, but I simply can't seem to find any solution for this. I'm trying to take an argument that can be either a string or an int, depending on the context, and I need to determine which type, (then convert it to int if it is indeed that type.)

Thank you 将字符串转换为整数(如果转换不成功则抛出错误)

答案1

得分: 7

例如,

package main

import (
	"errors"
	"fmt"
	"strconv"
)

func IntConv(arg interface{}) (int, error) {
	switch x := arg.(type) {
	case int:
		return x, nil
	case string:
		return strconv.Atoi(x)
	}
	return 0, errors.New("IntConv: invalid argument ")
}

func main() {
	fmt.Println(IntConv(7))
	fmt.Println(IntConv("42"))
}
英文:

For example,

package main

import (
	"errors"
	"fmt"
	"strconv"
)

func IntConv(arg interface{}) (int, error) {
	switch x := arg.(type) {
	case int:
		return x, nil
	case string:
		return strconv.Atoi(x)
	}
	return 0, errors.New("IntConv: invalid argument ")
}

func main() {
	fmt.Println(IntConv(7))
	fmt.Println(IntConv("42"))
}

答案2

得分: 4

func Atoi

func Atoi(s string) (i int, err error)
Atoi是ParseInt(s, 10, 0)的简写。

这是一个更新。为了澄清,由于Atoi接受字符串,因此尝试传递一个int将导致编译时错误。如果您需要在运行时进行检查,可以像这样做。

package main

import (
"fmt"
"strconv"
"errors"
)

func toInt(data interface{}) (n int, err error) {
switch t := data.(type) {
case int:
return t, nil
case string:
return strconv.Atoi(t)
default:
return 0, errors.New(fmt.Sprintf("Invalid type received: %T", t))
}

panic("unreachable!")

}

func main() {
var (
n int
err error
)

n, _ = toInt("1")
fmt.Println(n)

n, _ = toInt(2)
fmt.Println(n)

n, err = toInt(32.3)
fmt.Println(err)

}

英文:

http://golang.org/pkg/strconv/#Atoi

func Atoi

func Atoi(s string) (i int, err error)
Atoi is shorthand for ParseInt(s, 10, 0).

This is an update. To clarify, since Atoi accepts string, then trying to pass an int will cause a compile time error. If you need a check during runtime, then you can do something like this.

package main

import (
    "fmt"
    "strconv"
    "errors"
)

func toInt(data interface{}) (n int, err error) {
    switch t := data.(type) {
    case int:
	    return t, nil
    case string:
	    return strconv.Atoi(t)
    default:
	    return 0, errors.New(fmt.Sprintf("Invalid type received: %T", t))
    }

    panic("unreachable!")
}

func main() {
    var (
	    n int
	    err error
    )

    n, _ = toInt("1")
    fmt.Println(n)

    n, _ = toInt(2)
    fmt.Println(n)

    n, err = toInt(32.3)
    fmt.Println(err)
}

答案3

得分: 0

我有点晚来参加派对,但你也可以使用fmt.Sprintf

import "fmt"

func ConvertToString(x interface{}) string {
    return fmt.Sprintf("%v", x)
}

"%v"传递给Sprintf告诉它使用它所知道的最佳格式进行格式化,这基本上意味着“将x转换为字符串”。这比其他解决方案更短(可能更容易理解),但缺点是它允许输入不是intstring的情况。

英文:

I'm a bit late to the party, but you could also use fmt.Sprintf:

import "fmt"

func ConvertToString(x interface{}) string {
	return fmt.Sprintf("%v", x)
}

Passing "%v" to Sprintf tells it to format it using the best format it knows, which essentially just means "convert x to a string". This is shorter (and perhaps easier to understand) than the other solutions, but has the disadvantage that it'll allow inputs that aren't ints or strings.

huangapple
  • 本文由 发表于 2012年10月5日 07:18:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/12737372.html
匿名

发表评论

匿名网友

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

确定