Golang-类型转换之strconv包

又是一个类型转换的问题,每门语言都会踩这个坑,而且动静态语言差异还比较大,动态的不需要考虑如何转,而是需要考虑转成了什么。而go…都需要考虑了,学习一哈~

ParseBool

功能:将字符串转换为布尔值

说明:

  • func ParseBool(str string) (value bool, err error)

  • 接受真值:1, t, T, TRUE, true, True

  • 接受假值:0, f, F, FALSE, false, False

  • 其它任何值都返回一个错误

用法:

res, error := strconv.ParseBool(str)

FormatBool

功能:将布尔值转换为字符串 “true” 或 “false”

说明:

  • func FormatBool(b bool) string

用法:

str := strconv.FormatBool(0 < 1)

ParseFloat

功能:将字符串转换为浮点数

说明:

  • func ParseFloat(s string, bitSize int) (f float64, err error)

  • s:要转换的字符串

  • bitSize:指定浮点类型(32:float32、64:float64)

*如果 s 是合法的格式,而且接近一个浮点值,则返回浮点数的四舍五入值(依据 IEEE754 的四舍五入标准)

*如果 s 不是合法的格式,则返回“语法错误”

*如果转换结果超出 bitSize 范围,则返回“超出范围”

用法:

func main() {
s := "0.12345678901234567890"
f, err := strconv.ParseFloat(s, 32)
fmt.Println(f, err) // 0.12345679104328156
fmt.Println(float32(f), err) // 0.12345679
f, err = strconv.ParseFloat(s, 64)
fmt.Println(f, err) // 0.12345678901234568
}

ParseInt

功能:将字符串转换为 int 类型

说明:

  • func ParseInt(s string, base int, bitSize int) (i int64, err error)

  • s:要转换的字符串

  • base:进位制(2 进制到 36 进制)

  • bitSize:指定整数类型(0:int、8:int8、16:int16、32:int32、64:int64)

  • 如果 base 为 0,则根据字符串的前缀判断进位制(0x:16,0:8,其它:10)

用法:

func main() {
fmt.Println(strconv.ParseInt("123", 10, 8))
// 123
fmt.Println(strconv.ParseInt("12345", 10, 8))
// 127 strconv.ParseInt: parsing "12345": value out of range
fmt.Println(strconv.ParseInt("2147483647", 10, 0))
// 2147483647
fmt.Println(strconv.ParseInt("0xFF", 16, 0))
// 0 strconv.ParseInt: parsing "0xFF": invalid syntax
fmt.Println(strconv.ParseInt("FF", 16, 0))
// 255
fmt.Println(strconv.ParseInt("0xFF", 0, 0))
// 255
}

Atoi

功能:将字符串转换为 int 类型

说明:

  • func Atoi(s string) (i int, err error)

  • 相当于 ParseInt(s, 10, 0)

用法:

func main() {
fmt.Println(strconv.Atoi("2147483647"))
// 2147483647
fmt.Println(strconv.Atoi("2147483648"))
// 2147483647 strconv.ParseInt: parsing "2147483648": value out of range
}

FormatFloat

功能:将浮点数 f 转换为字符串值

说明:

  • func FormatFloat(f float64, fmt byte, prec, bitSize int) string

  • 参数:

f:要转换的浮点数

fmt:格式标记(b、e、E、f、g、G)

prec:精度(数字部分的长度,不包括指数部分)

bitSize:指定浮点类型(32:float32、64:float64)

  • 格式标记:

‘b’ (-ddddp±ddd,二进制指数)

‘e’ (-d.dddde±dd,十进制指数)

‘E’ (-d.ddddE±dd,十进制指数)

‘f’ (-ddd.dddd,没有指数)

‘g’ (‘e’:大指数,’f’:其它情况)

‘G’ (‘E’:大指数,’f’:其它情况)

  • 如果格式标记为 ‘e’,’E’和’f’,则 prec 表示小数点后的数字位数

  • 如果格式标记为 ‘g’,’G’,则 prec 表示总的数字位数(整数部分+小数部分)

用法:

package main

import (
"fmt"
"strconv"
)

func main() {
f := 100.12345678901234567890123456789
fmt.Println(strconv.FormatFloat(f, 'b', 5, 32))
// 13123382p-17
fmt.Println(strconv.FormatFloat(f, 'e', 5, 32))
// 1.00123e+02
fmt.Println(strconv.FormatFloat(f, 'E', 5, 32))
// 1.00123E+02
fmt.Println(strconv.FormatFloat(f, 'f', 5, 32))
// 100.12346
fmt.Println(strconv.FormatFloat(f, 'g', 5, 32))
// 100.12
fmt.Println(strconv.FormatFloat(f, 'G', 5, 32))
// 100.12
fmt.Println(strconv.FormatFloat(f, 'b', 30, 32))
// 13123382p-17
fmt.Println(strconv.FormatFloat(f, 'e', 30, 32))
// 1.001234588623046875000000000000e+02
fmt.Println(strconv.FormatFloat(f, 'E', 30, 32))
// 1.001234588623046875000000000000E+02
fmt.Println(strconv.FormatFloat(f, 'f', 30, 32))
// 100.123458862304687500000000000000
fmt.Println(strconv.FormatFloat(f, 'g', 30, 32))
// 100.1234588623046875
fmt.Println(strconv.FormatFloat(f, 'G', 30, 32))
// 100.1234588623046875
}

暂时只用到了这些,其他的以后用到再做补充~

To be continued!!!