Golang笔记--strconv包的基本用法

import "strconv"

数值转换

  • 字符串转为整型
// 将字符中解析为整数, ParseInt支持正负号; ParseUint不支持正负号,用于无符号整数
// 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) 
func ParseUint(s string, base int, bitSize int)(i uint64, err error) 
    
// Atoi是ParseInt(s,10,0)的简写,能将字符串转为10进制整数
func Atoi(s string)(i int, err error)

// 示例
fmt.Println(strconv.ParseInt("-12", 10, 0)) // -12 
fmt.Println(strconv.ParseInt("0xFF", 10, 0)) // 0 strconv.ParseInt: parsing "0xFF": invalid syntax
fmt.Println(strconv.ParseInt("0xFF", 0, 0)) // 255 
fmt.Println(strconv.ParseInt("FF", 16, 0)) // 255 

fmt.Println(strconv.ParseUint("-12", 10, 0)) // 0 strconv.ParseUint: parsing "-12": invalid syntax
fmt.Println(strconv.ParseUint("12", 10, 0)) // 12 

fmt.Println(strconv.Atoi("12")) // 12 
复制代码
  • 整数转为字符串
// 将整数转为字符串形式,FormatUint是FormatInt的无符号版本,负责处理无符号整数
// base 表示整数的进制,base 必须在2到36之间,结果中会使用小写字母'a'到'z'表示大于10的数字。
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string

// ItoaFormatInt(i, 10) 的简写,能将10进制整数转为字符串
func Itoa(i int) string

// 示例
fmt.Println(strconv.FormatInt(12, 2)) // 1100
fmt.Println(strconv.FormatInt(-12, 2)) // 1100
fmt.Println(strconv.FormatUint(12, 10)) // 12
fmt.Println(strconv.Itoa(12)) // 12
复制代码
  • 将字符串转为浮点数
// 解析一个表示浮点数的字符串并返回其值。
// 如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。
// bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;
// 返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
func ParseFloat(s string, bitSize int) (f float64, err error)

// 示例
v := "4.12345678"
if s, err := strconv.ParseFloat(v, 32); err == nil {
	fmt.Printf("%T, %v\n", s, s) // float64, 4.123456954956055
}
if s, err := strconv.ParseFloat(v, 64); err == nil {
	fmt.Printf("%T, %v\n", s, s) // float64, 4.12345678
}
复制代码
  • 将浮点数转为字符串
// 将浮点数转为字符串
// bitSize 表示来源类型(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

// 示例
s32 := strconv.FormatFloat(v, 'E', -1, 32)
fmt.Printf("%T, %v\n", s32, s32) // string, 4.123457E+00

s64 := strconv.FormatFloat(v, 'E', -1, 64)
fmt.Printf("%T, %v\n", s64, s64) // string, 4.12345678E+00
复制代码
  • 将字符串转为布尔值
// 返回字符串表示的bool值
// 只接收1、0、t、f、T、F、true、false、True、False、TRUE、FALSE作为参数;否则返回错误。
func ParseBool(str string) (value bool, err error)

// 示例
fmt.Println(strconv.ParseBool("1")) // true
复制代码
  • 将布尔值转为字符串
// 根据布尔值返回"true"或"false"
func FormatBool(b bool) string

// 示例
fmt.Println(strconv.FormatBool(true)) // true
复制代码

其他函数

  • 判断是否可打印(可在显示器上显示)
// 判断一个字符是否是可打印的,和unicode.IsPrint一样。
// r必须是:字母(广义)、数字、标点、符号、ASCII空格
func IsPrint(r rune) bool
复制代码
  • 判断字符串能否表示为表示为一个单行的、没有空格和tab之外控制字符的反引号字符串(不进行任何修改)。
// 判断字符串s是否可以不被修改的表示为一个单行的、没有空格和tab之外控制字符的反引号字符串。
func CanBackquote(s string) bool
复制代码
  • 返回字符串双引号字面值表示
// 返回字符串在go语法下的双引号字面值表示(即双引号标记的字符串如:"xxx")。
// Quote中,控制字符、不可打印字符会进行转义。(如\t,\n,\xFF,\u0100)。
// QuoteToASCII中,,控制字符和不可打印字符、非ASCII字符会进行转义。
// QuoteToGraphic中,非图形字符会被转义。
// ps:转义(即:被替换为转义字符)。
func Quote(s string) string
func QuoteToASCII(s string) string
func QuoteToGraphic(s string) string

 // 示例
fmt.Println(strconv.Quote(`;khfvs'\"bchsbd\t`)) // ";khfvs'\\\"bchsbd\\t"
fmt.Println(strconv.QuoteToASCII(`"Fran & Freddie's Diner	☺ \t"`)) // "\"Fran & Freddie's Diner\t\u263a \\t\""
fmt.Println(strconv.QuoteToGraphic(`"Fran & Freddie's Diner	☺ \t"`)) // "\"Fran & Freddie's Diner\t☺ \\t\""

复制代码
  • 返回字符单引号字面值表示
// 返回字符r在go语法下的单引号字面值表示(即双引号标记的字符如:'x')。
// QuoteRune中,控制字符、不可打印字符会进行转义。(如\t,\n,\xFF,\u0100)
// QuoteRuneToASCII中,控制字符、不可打印字符、非ASCII字符会进行转义
// QuoteRuneToGraphic中,非图形字符会被转义
func QuoteRune(r rune) string
func QuoteRuneToASCII(r rune) string
func QuoteRuneToGraphic(r rune) string

// 示例
fmt.Println(strconv.QuoteRune('☺'))// '☺'
fmt.Println(strconv.QuoteRuneToASCII('☺')) // '\u263a'
fmt.Println(strconv.QuoteRuneToGraphic('☺')) // '☺'
复制代码
  • 解析字符串
// 将带有单引号、双引号、反引号的字符串转为常规字符串
// 函数假设s是一个单引号、双引号、反引号包围的go语法字符串,解析它并返回它表示的值。(如果是单引号括起来的,函数会认为s是go字符字面值,返回一个单字符的字符串)
func Unquote(s string) (t string, err error)

// 将带引号字符串(不包含首尾的引号)中的第一个字符“取消转义”并解码
// 1) value,表示一个rune值或者一个byte值
// 2) multibyte,表示value是否是一个多字节的utf-8字符
// 3) tail,表示字符串剩余的部分
// 4) err,表示可能存在的语法错误

// 参数 quote 定义“引号符”语法规范
// 如果设置为单引号,则认为单引号是语法字符, s 中允许出现 \'、" 字符,不允许出现单独的 ' 字符
// 如果设置为双引号,则认为双引号是语法字符, s 中允许出现 \"、' 字符,不允许出现单独的 " 字符
// 如果设置为 0,函数把单引号和双引号当成普通字符,则可以出现单独的 ' 或 " 字符,但不允许出现 \' 或 \" 字符,
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)

// 示例
fmt.Println(strconv.Unquote("`or backquoted.`"))    // or backquoted.  
fmt.Println(strconv.Unquote("\"The string must be either double-quoted\""))    // The string must be either double-quoted  
fmt.Println(strconv.Unquote("'\u2639'"))    // ☹  

value, mb, tail ,err := strconv.UnquoteChar(`\"Test *&^$ Test Func\"`, '"')
fmt.Println(value, mb, tail ,err)// 34 false Test *&^$ Test Func\" 
fmt.Println(string(value), mb, tail ,err)// " false Test *&^$ Test Func\" 
复制代码
  • 添加到字符串尾部
// 将其他数据类型转为string后添加到dst尾部,转换规则与前面具体类型转换字符串的方法一致
func AppendBool(dst []byte, b bool) []byte
func AppendInt(dst []byte, i int64, base int) []byte
func AppendUint(dst []byte, i uint64, base int) []byte
func AppendFloat(dst []byte, f float64, fmt byte, prec int, bitSize int) []byte

// 将字符串sAppend后面的方法(QuoteQuoteRune)转换后,再将转换的字符添加到dst后面
func AppendQuote(dst []byte, s string) []byte
func AppendQuoteToASCII(dst []byte, s string) []byte
func AppendQuoteRune(dst []byte, r rune) []byte
func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
func AppendQuoteRuneToGraphic(dst []byte, r rune) []byte
复制代码

错误类型

  • strconv 定义的两种错误类型:ErrRange和ErrSyntax。在将string转为其他类型失败的时候,会构造一个NumError类型的error对象返回,该对象包括了上述两种错误类型的描述。
  • ErrRange 表示值超过了类型能表示的最大范围,比如将 "128" 转为 int8 就会返回这个错误。
  • ErrSyntax表示不符合目标类型语法,即语法错误,比如将 "" 转为 int 类型会返回这个错误。
  • NumError结构
// A NumError records a failed conversion.
type NumError struct {
	Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
	Num  string // the input
	Err  error  // the reason the conversion failed (ErrRange, ErrSyntax)
}
复制代码
  • 实现Error输出错误信息的接口
func (e *NumError) Error() string
复制代码

转载于:https://juejin.im/post/5c18d0c2e51d45270f53fc1d

你可能感兴趣的:(golang)