Go 语言标准库之 strconv 包

Go 语言的 strconv 包实现了字符串与其它类型的互相转换,本文介绍 strconv 包的常用操作。

Parse 类型

字符串解析为布尔值 ParseBool

// 返回字符串表示的 bool 值,接受 1、0、t、f、T、F、true、false、True、False、TRUE、FALSE
func ParseBool(str string) (value bool, err error)

☕️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    flag, err := strconv.ParseBool("1")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("t")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("T")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("true")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("True")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("TRUE")
    fmt.Println(flag, err) // true <nil>

    flag, err = strconv.ParseBool("TRue")
    fmt.Println(flag, err) // false strconv.ParseBool: parsing "TRue": invalid syntax

    flag, err = strconv.ParseBool("0")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("f")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("F")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("false")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("False")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("FALSE")
    fmt.Println(flag, err) // false <nil>

    flag, err = strconv.ParseBool("FALse")
    fmt.Println(flag, err) // false strconv.ParseBool: parsing "FALse": invalid syntax
}

字符串解析为有符号整数 ParseInt

// 将字符串解析为整数,接受正负号
// base 指定进制(2 到 36),如果 base 为 0,则从字符串前缀判断,"0x" 是 16 进制,"0" 是 8 进制,其它是 10 进制
// bitSize 指定解析结果的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64
// 返回的 err 是 *NumErr 类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围 err.Error = ErrRange
func ParseInt(s string, base int, bitSize int) (i int64, err error)

⭐️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    num, err := strconv.ParseInt("123", 10, 8)
    fmt.Println(num, err) // 123 <nil>

    num, err = strconv.ParseInt("12345", 10, 8)
    fmt.Println(num, err) // 127 strconv.ParseInt: parsing "12345": value out of range

    num, err = strconv.ParseInt("2147483647", 10, 0)
    fmt.Println(num, err) // 2147483647 <nil>

    num, err = strconv.ParseInt("0xFF", 16, 0)
    fmt.Println(num, err) // 0 strconv.ParseInt: parsing "0xFF": invalid syntax

    num, err = strconv.ParseInt("FF", 16, 0)
    fmt.Println(num, err) // 255 <nil>

    num, err = strconv.ParseInt("0xFF", 0, 0)
    fmt.Println(num, err) // 255 <nil>
}

字符串解析为无符号整数 ParseUint

// ParseUint 类似 ParseInt 但不接受正负号,用于无符号整型
func ParseUint(s string, base int, bitSize int) (n uint64, err error)

✏️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    num, err := strconv.ParseUint("FF", 16, 8)
    fmt.Println(num, err) // 255 <nil>
}

字符串解析为浮点数 ParseFloat

// 将字符串解析为浮点数,如果 s 符合语法规则,会返回一个最为接近 s 表示值得浮点数(IEEE754 规范舍入)
// bitSize 指定解析结果的浮点数类型,32 是 float32,64 是 float64
// 返回值 err 是 *NumErr 类型的,语法有误时,err.Error = ErrSyntax;结果超出表示范围时,返回值 f 为 ±Inf,err.Error= ErrRange
func ParseFloat(s string, bitSize int) (f float64, err error)

📚 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    s := "0.12345678901234567890"
    f, err := strconv.ParseFloat(s, 32)
    fmt.Println(f, err)          // 0.12345679104328156 <nil>
    fmt.Println(float32(f), err) // 0.12345679 <nil>

    f, err = strconv.ParseFloat(s, 64)
    fmt.Println(f, err) // 0.12345678901234568 <nil>
}

Format 类型

布尔值转换为字符串 FormatBool

// 根据 b 的值返回字符串 "true" 或 "false"
func FormatBool(b bool) string

✌ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    fmt.Printf("%q\n", strconv.FormatBool(0 < 1)) // "true"
    fmt.Printf("%q\n", strconv.FormatBool(0 > 1)) // "false"
}

有符号整数转换为字符串 FormatInt

// 将有符号整数转换为 base 进制的字符串。base 必须在 2 到 36 之间,结果中会使用到小写字母 'a' 到 'z'
func FormatInt(i int64, base int) string

✍ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := int64(-2048)
    fmt.Printf("%q\n", strconv.FormatInt(i, 2))  // "-100000000000"
    fmt.Printf("%q\n", strconv.FormatInt(i, 8))  // "-4000"
    fmt.Printf("%q\n", strconv.FormatInt(i, 10)) // "-2048"
    fmt.Printf("%q\n", strconv.FormatInt(i, 16)) // "-800"
    fmt.Printf("%q\n", strconv.FormatInt(i, 36)) // "-1kw"
}

无符号整数转换为字符串 FormatUint

// FormatInt 的无符号整数版本
func FormatUint(i uint64, base int) string

✍ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := uint64(2048)
    fmt.Printf("%q\n", strconv.FormatUint(i, 2))  // "100000000000"
    fmt.Printf("%q\n", strconv.FormatUint(i, 8))  // "4000"
    fmt.Printf("%q\n", strconv.FormatUint(i, 10)) // "2048"
    fmt.Printf("%q\n", strconv.FormatUint(i, 16)) // "800"
    fmt.Printf("%q\n", strconv.FormatUint(i, 36)) // "1kw"
}

浮点数转换为字符串 FormatFloat

// 将浮点数 f 转换为字符串,bitSize 表示 f 的来源类型(32:float32、64:float64),会据此进行舍入。
// fmt 表示转换的格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、
//     'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用 'e' 格式,否则 'f' 格式)、'G'(指数很大时用 'E' 格式,否则 'f' 格式)
// prec 控制精度(排除指数部分):对 'f'、'e'、'E',它表示小数点后的数字个数;对 'g'、'G',它控制总的数字个数 
//      如果 prec 为 -1,则代表使用最少数量的、但又必须的数字来表示 f
func FormatFloat(f float64, fmt byte, prec, bitSize int) string

💡 示例代码

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
    fmt.Println(strconv.FormatFloat(f, 'g', -1, 32)) // 100.12346
}

string 和 int 互相转换

字符串解析为整数 Atoi

// 将字符串解析为整数,是 ParseInt(s, 10, 0) 的简写
func Atoi(s string) (i int, err error)

☕️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 64 位的计算机
    num, err := strconv.Atoi("9223372036854775807")
    fmt.Println(num, err) // 9223372036854775807 <nil>

    num, err = strconv.Atoi("9223372036854775808")
    fmt.Println(num, err) // 9223372036854775807 strconv.Atoi: parsing "9223372036854775808": value out of range
}

整数转换为字符串 Itoa

// 将整数转换为字符串,是 FormatInt(i, 10) 的简写
func Itoa(i int) string

⭐️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    fmt.Println(strconv.Itoa(-2048)) // -2048
    fmt.Println(strconv.Itoa(2048))  // 2048
}

其它函数

判断字符是否可显示 isPrint

// 判断字符 r 是否是一个可显示的字符
func IsPrint(r rune) bool

✏️ 示例代码

package main

import (
    "fmt"
    "strconv"
)

func main() {
    fmt.Println(strconv.IsPrint('a'))  // true
    fmt.Println(strconv.IsPrint('好'))  // true
    fmt.Println(strconv.IsPrint(' '))  // true
    fmt.Println(strconv.IsPrint('\t')) // false
    fmt.Println(strconv.IsPrint('\n')) // false
}

参考

  1. go中 -strconv包的使用
  2. Go语言内置包之strconv
posted @ 2021-12-01 15:16  呵呵233  阅读(152)  评论(0编辑  收藏  举报