字符串與數值之間進行轉換是一個高頻操作,在go語言中,SDK提供 strconv.ParseInt
將字符串轉換為數值,strconv.FormatInt
可以將數值轉換為字符串。
1.首先看下 strconv.ParseInt
函數如何使用:
func ParseInt(s string, base int, bitSize int) (i int64, err error){}
參數:
- s:數字的字符串形式
- base:數字字符串的進制,比如:2進制、10進制。
- bitSize:預期數值的bit大小,用於數值上限限制,最終返回的還是int64類型
2.下面看下函數的具體實現:
strconv.ParseInt
是 strconv.ParseUint
的一個包裝層,區別在數值結果的基礎上處理符號,因此具體的實現在strconv.ParseUint
里面。
func ParseUint(s string, base int, bitSize int) (uint64, error) {
...
case base == 0:
// Look for octal, hex prefix.
base = 10 // 當base = 0,默認 base 按賦值10進制
if s[0] == '0' {
switch {
case len(s) >= 3 && lower(s[1]) == 'b': // 根據字符串的前綴,來判斷二進制。下面同理
base = 2
s = s[2:]
case len(s) >= 3 && lower(s[1]) == 'o':
base = 8
s = s[2:]
case len(s) >= 3 && lower(s[1]) == 'x':
base = 16
s = s[2:]
default:
base = 8 // 當 0 開頭,默認8進制
s = s[1:]
}
}
default:
return 0, baseError(fnParseUint, s0, base)
}
}
根據進制 base 進制數計算數值,支持2~ 36進制[0-9A-Z]
func ParseUint(s string, base int, bitSize int) (uint64, error) {
...
// 逐個字符判斷,然后累加求和
for _, c := range []byte(s) {
var d byte
switch {
case c == '_' && base0:
underscores = true
continue
case '0' <= c && c <= '9':
d = c - '0'
// 支持2 ~ 36進制
case 'a' <= lower(c) && lower(c) <= 'z':
d = lower(c) - 'a' + 10
default:
return 0, syntaxError(fnParseUint, s0)
}
if d >= byte(base) {
return 0, syntaxError(fnParseUint, s0)
}
if n >= cutoff {
// n*base overflows
return maxVal, rangeError(fnParseUint, s0)
}
n *= uint64(base)
n1 := n + uint64(d)
if n1 < n || n1 > maxVal {
// n+v overflows
return maxVal, rangeError(fnParseUint, s0)
}
n = n1
}
}
3.使用strconv.FormatInt
將數值轉換為字符串
func FormatInt(i int64, base int) string {}
參數:
- i:10進制數值
- base:進制數
示例:
// 將10進制數 15 轉換為 16 進制的字符串形式
func Test_FormatUint(t *testing.T) {
val := strconv.FormatUint(15, 16)
fmt.Println(val) // output:f
}