Golang筆記--strconv包的基本用法

炎灸紋舞發表於2018-12-18

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 <nil>
fmt.Println(strconv.ParseInt("0xFF", 10, 0)) // 0 strconv.ParseInt: parsing "0xFF": invalid syntax
fmt.Println(strconv.ParseInt("0xFF", 0, 0)) // 255 <nil>
fmt.Println(strconv.ParseInt("FF", 16, 0)) // 255 <nil>

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

fmt.Println(strconv.Atoi("12")) // 12 <nil>
複製程式碼
  • 整數轉為字串
// 將整數轉為字串形式,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.  <nil>
fmt.Println(strconv.Unquote("\"The string must be either double-quoted\""))    // The string must be either double-quoted  <nil>
fmt.Println(strconv.Unquote("'\u2639'"))    // ☹  <nil>

value, mb, tail ,err := strconv.UnquoteChar(`\"Test *&^$ Test Func\"`, '"')
fmt.Println(value, mb, tail ,err)// 34 false Test *&^$ Test Func\" <nil>
fmt.Println(string(value), mb, tail ,err)// " false Test *&^$ Test Func\" <nil>
複製程式碼
  • 新增到字串尾部
// 將其他資料型別轉為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
複製程式碼

相關文章