Go语言fmt.Sprintf、fmt.Printf(格式化输出)
fmt.Printf
fmt.Printf在程序中使用%f来格式化所需的值
看起来我们的值被四舍五入到了一个合理的数。但小数点后仍显示了6位,这对我们当前的需要来说实在是太多了。
对于这种情况,格式化动词允许你指定格式化值的宽度。
假设我们想在纯文本表中格式化一些数据。我们需要确保格式化的值填充最少数量的空格,以便列能够正确对齐。
可以在格式化动词的百分号后面指定最小宽度。如果匹配该动词的参数比最小宽度短,则将使用空格进行填充,直到达到最小宽度为止。
你可以使用值宽度来指定浮点数的精度(显示的位数)。格式如下:
整个数的最小宽度包括数字位和小数点。如果包括的话,较短的数将在开始处填充空格,直到达到这个宽度。如果省略的话,就不会添加任何空格。
小数点后的宽度是要显示的小数位数。如果给出更精确的数字,它将被四舍五入(向上或向下)以适应给定的小数位数。下面是运行中的各种宽度值的快速演示:
最后一种格式是"%.2f",将允许我们取任意精度的浮点数,并将它们四舍五入到小数点后两位。(它也不会做任何不必要的填充。)
fmt.Sprintf
fmt.Sprintf格式化在逻辑中非常常用。使用格式化函数,要注意写法:
fmt.Sprintf(格式化样式, 参数列表…)
- 格式化样式:字符串形式,格式化动词以
%
开头。 - 参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
在 Go 语言中,格式化的命名延续C语言风格:
package main
import (
"fmt"
)
func main() {
var progress = 2
var target = 8
// 两参数格式化
title := fmt.Sprintf("已采集%d个药草, 还需要%d个完成任务", progress, target)
fmt.Println(title)
pi := 3.14159
// 按数值本身的格式输出
variant := fmt.Sprintf("%v %v %v", "月球基地", pi, true)
fmt.Println(variant)
// 匿名结构体声明, 并赋予初值
profile := &struct {
Name string
HP int
}{
Name: "rat", HP: 150}
fmt.Printf("使用'%%+v' %+v\n", profile)
fmt.Printf("使用'%%#v' %#v\n", profile)
fmt.Printf("使用'%%T' %T\n", profile)
}
代码输出如下:
已采集2个药草, 还需要8个完成任务 "月球基地" 3.14159 true 使用'%+v' &{Name:rat HP:150} 使用'%#v' &struct { Name string; HP int }{Name:"rat", HP:150} 使用'%T' *struct { Name string; HP int }C语言中, 使用%d代表整型参数
fmt.Sprintf("%0*d", 8, 123) 结果是 00000123 %0*d % 表示这个是一个 格式控制串 0 这个填充字符,表示当输出长度不足指定长度时候, 用 0填充不足的部分 * 是占位符,表示具体的宽度由后面的参数来指定输出宽度 d 这个表示输出整数 fmt.Sprintf( "%0*d", 5, 123 ); 也等价于 fmt.Sprintf("%05d",123);结果也是 00123
下表中标出了常用的一些格式化样式中的动词及功能。
动 词 | 功 能 |
---|---|
%v | 按值的本来值输出 |
%+v | 在 %v 基础上,对结构体字段名和值进行展开 |
%#v | 输出 Go 语言语法格式的值 |
%T | 输出 Go 语言语法格式的类型和值 |
%% | 输出 % 本体 |
%b | 整型以二进制方式显示 |
%o | 整型以八进制方式显示 |
%d | 整型以十进制方式显示 |
%x | 整型以十六进制方式显示 |
%X | 整型以十六进制、字母大写方式显示 |
%U | Unicode 字符 |
%f | 浮点数 |
%p | 指针,十六进制方式显示 |
\n
:换行符\r
:回车符\t
:tab 键\u
或\U
:Unicode 字符\\
:反斜杠自身