Go strconv包_字符串和数值类型的转换

将字符串转换成数值类型和布尔类型
package main

import (
	"fmt"
	"strconv"
)

func main() {

	str1 := "0.23"
	f1, _ := strconv.ParseFloat(str1, 64)
	f2, _ := strconv.ParseFloat(str1, 32)
	fmt.Println(f1) //0.23
	fmt.Println(f2) //0.23
	fmt.Println(f2 * 100)

	str2 := "1234f" // 16进制的字符串
	// 将字符串解析为整数,ParseInt 支持正负号,ParseUint 不支持正负号。
	// base 表示进位制(2 到 36),如果 base 为 0,则根据字符串前缀判断,
	// 前缀 0x 表示 16 进制,前缀 0 表示 8 进制,否则是 10 进制。
	// bitSize 表示结果的位宽(包括符号位),0 表示最大位宽。
	n, err := strconv.ParseInt(str2, 16, 32)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%x\n", n)

	str3 := "12"
	c, _ := strconv.ParseUint(str3, 10, 32)
	fmt.Println(c)

	str4 := "true"
	// 将字符串转换为布尔值
	// 它接受真值:1, t, T, TRUE, true, True
	// 它接受假值:0, f, F, FALSE, false, False
	// 其它任何值都返回一个错误。
	b, _ := strconv.ParseBool(str4)
	if b {
		fmt.Println("ParseBool")
	}

	str5 := "12345"
	// 将字符串转换为十进制整数,即:ParseInt(s, 10, 0) 的简写)
	//  alphanumeric to integer
	i, _ := strconv.Atoi(str5)
	fmt.Println(i)
}

 

将浮点数转换成字符串

Go提供了两种size的浮点数,float32和float64。

它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。可以表示的最大的范围是

fmt.Printf("%e\n", math.MaxFloat32)
fmt.Printf("%e\n", math.MaxFloat64)

使用 fmt.Sprintf 可以将浮点数格式化输出为字符串,

%b 无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat 的 'b' 转换格式一致。例如 -123456p-78

%e 科学计数法,例如 -1234.456e+78

%E 科学计数法,例如 -1234.456E+78

%f 有小数点而无指数,例如 123.456

%g 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的 0)输出

%G 根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的 0)输出

示例,

package main

import (
	"fmt"
)

func main() {
	f := 3.1415926
	str1 := fmt.Sprintf("%f", f)
	// 使用小数点后7位的精度进行打印,打印宽度是8个字符
	str2 := fmt.Sprintf("%8.7f", f)
	fmt.Println(str1) //3.141593
	fmt.Println(str2)

	str3 := fmt.Sprintf("%e", f)
	fmt.Println(str3)

	str4 := fmt.Sprintf("%g", f)
	fmt.Println(str4)
}

运行如下,

3.141593
3.1415926
3.141593e+00
3.1415926

这里需要注意Golang浮点型的默认舍入规则如下,

package main

import (
	"fmt"
)

func main() {
	fmt.Printf("9.8249	=>	%0.2f(四舍)\n", 9.8249)
	fmt.Printf("9.82671	=>	%0.2f(六入)\n", 9.82671)
	fmt.Printf("9.8351	=>	%0.2f(五后非零就进一)\n", 9.8351)
	fmt.Printf("9.82501	=>	%0.2f(五后非零就进一)\n", 9.82501)
	fmt.Printf("9.8250	=>	%0.2f(五后为零看奇偶,五前为偶应舍去)\n", 9.8250)
	fmt.Printf("9.8350	=>	%0.2f(五后为零看奇偶,五前为奇要进一)\n", 9.8350)
}

 

同时还可以使用 strconv.FormatFloat 函数可以将浮点数转换成字符串。

package main

import (
	"strconv"
	"fmt"
)

func main() {
	f := 3.1415926

	// FormatFloat 将浮点数 f 转换为字符串形式
	// 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 表示总的数字位数(整数部分+小数部分)
	// 参考格式化输入输出中的旗标和精度说明
	str1 := strconv.FormatFloat(f, 'f', 2, 64)
	fmt.Println(str1) //3.14

	str2 := strconv.FormatFloat(f, 'f', -1, 64)
	fmt.Println(str2) //3.1415926
}

 

将整形转换成字符串
package main

import (
	"fmt"
	"strconv"
)

func main() {

	i1 := 209878
	// 将整数转换为字符串形式。base 表示转换进制,取值在 2 到 36 之间。
	// 结果中大于 10 的数字用小写字母 a - z 表示。
	str1 := strconv.FormatInt(int64(i1), 10)
	str2 := strconv.FormatInt(int64(i1), 16)
	fmt.Println(str1)
	fmt.Println(str2)

	// 将整数转换为十进制字符串形式(即:FormatInt(i, 10) 的简写)
	str3 := strconv.Itoa(i1)
	fmt.Println(str3)
}

 

将各种类型转换为字符串后追加到 dst 尾部
package main

import (
	"strconv"
	"fmt"
)

func main() {

	str := "hello world"

	dst := []byte(str)

	dst = append(dst, '-')
	dst = strconv.AppendBool(dst, true)
	dst = append(dst, '-')
	dst = strconv.AppendInt(dst, 12, 10)
	dst = append(dst, '-')
	dst = strconv.AppendFloat(dst, 3.1415926, 'f', 2, 64)

	fmt.Println(string(dst))
}

==========END==========