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 字符
  • \\:反斜杠自身
posted @ 2020-03-19 11:34  牛奔  阅读(6165)  评论(0编辑  收藏  举报