zoukankan      html  css  js  c++  java
  • Golang格式化小结

    Golang的格式化使用了与c、python等语言类似的风格,但是更加丰富和通用。格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Println等等。其中Print,Fprint,Sprint都有一个对应d的ln函数版本和print版本(f指format,ln指line)。

    Print版本 f版本 ln版本 输出
    Print Printf Println 结果写到标准输出
    Sprint Sprintf Sprintln 结果会以字符串形式返回
    Fprint Fprintf Fprintln 输出结果会被写入到第一个参数提供的输出中

    ln版本(Println,Fprintln,Sprintln),这些函数不接受格式字符串,每个参数都会使用一个缺省的格式字符串。而且ln版本还会在参数之间插入一个空格,并且在末尾添加一个换行符。而以ln结尾的格式化函数,则遵循Println的方式。Print版本只有当两边的操作数都不是字符串的时候,才会添加一个空格。f版本格式化函数需要指定格式化字符串参数,指定后续参数被如何格式化。各个参数的格式取决于"转换字符"(conversion character),形式为:百分号+字母,如,%d。按照惯例,以字母f结尾的格式化函数,如:log.Printf、fmt.Errorf都采用fmt.Printf的格式化标准。

    1.格式字符串

    Golang的格式化字符串由普通字符和占位符组成,如:

      "abcd%+ #8.3[3]vefg"
    

    其中abcd和efg是普通字符,其他部分是占位符。占位符以%开头,以动词结尾,格式如下:

    %[旗标][宽度][.精度][arg索引]动词
    

    其中,方括号中的内容是可缺省的。

    1.1旗标

    旗标有以下几种:

    +:  对于数值类型总是输出正负号;对于%q(%+q)保证只输出ASCII编码的字符
    
    -:  在右边进行宽度填充,而不是默认的左边。
    
    空格:  对于数值类型的正数,保留一个空白的符号位(其它用法在动词部分说明)。
    
    0:  用 0 进行宽度填充而不用空格,对于数值类型,符号将被移到所有 0 的前面。
    
    #:  备用格式:为八进制添加前缀0(%#o);为十六进制添加前缀0x(%#x)或者0X(%#X);
        为%p(%#p)去掉前缀0x;。
    
    其中 "0" 和 "-" 不能同时使用,优先使用 "-" 而忽略 "0"。
    

    格式化转换列表如下:

    1.2宽度-精度

    宽度与精度的控制格式以Unicdoe码点为单位,这和C的printf不同,它以字节数为单位。两者或者其中之一均可以用'*'表示,此时它们的值会从下一个操作数中获取,该操作数类型必须为int。

    • 对数值而言,宽度为该数值占用区域的最小宽度;精度为小数点后的位数。但是对%g(%G),精度为数字的总和。
    • 对于大多数数值而言,宽度为输出的最小字符串,如果必要则会为已格式化的形式添加空格。
    • 对于字符串,精度为输出的最大字符数,必要时会截断字符串。

    1.3占位符

    格式 说明
    %d 十进制数
    %b,%o,%x 二进制、八进制、十六进制整数
    %#b,%#o,%#x 二进制、八进制、十六进制整数,并显示相应前缀
    %f,%g,%e 浮点数
    %t 布尔值: true或者false
    %c 相应Unicode码点表示的字符
    %s 字符串
    %U 显示Unicode码点
    %q 带双引号的字符串"abc123"或者带单引号的字符'a','b'
    %v 变量的自然形式(natural format)
    %#v 使用Go语言类是的语法打印变量值
    %T 变量的类型
    %% 字面上的百分号标志(无操作数)
    %p 十六进制表示指针地址,并使用前缀0x

    1.4 格式化整数

    	num := 022
    	fmt.Printf("%d
    ", num)                       //十进制
    	fmt.Printf("%b
    ", num)                       //二进制
    	fmt.Printf("%o	 %#o 
    ", num, num)           //八进制,显示0前缀
    	fmt.Printf("%x	 %#x 	%#X
    ", num, num, num) //十六进制,显示0x,0X前缀
    	// output:
    	// 18
    	// 10010
    	// 22       022
    	// 12       0x12   0X12
    

    1.5 浮点数

    浮点数格式化,可以使用%f、%g、%e,这三种打印形式都可以指定打印的宽度、控制打印的精度。

    格式 说明
    %e,%E 科学计数法,以10为底
    %f,%F 普通小数格式
    %g 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的 0)输出
    %G 根据情况选择 %E 或 %F 以产生更紧凑的(无末尾的 0)输出
        for x := 0; x < 12; x++ {
    		fmt.Printf("x = %2d e^x = %9.3f	(%9.3[2]e)	(%9.3[2]g)
    ", x, math.Exp(float64(x)))
    	}
    	// output:          %9.3f    %9.3[2]e        %9.3[2]g
    	// x =  0 e^x =     1.000  (1.000e+00)     (        1)
    	// x =  1 e^x =     2.718  (2.718e+00)     (     2.72)
    	// x =  2 e^x =     7.389  (7.389e+00)     (     7.39)
    	// x =  3 e^x =    20.086  (2.009e+01)     (     20.1)
    	// x =  4 e^x =    54.598  (5.460e+01)     (     54.6)
    	// x =  5 e^x =   148.413  (1.484e+02)     (      148)
    	// x =  6 e^x =   403.429  (4.034e+02)     (      403)
    	// x =  7 e^x =  1096.633  (1.097e+03)     (  1.1e+03)
    	// x =  8 e^x =  2980.958  (2.981e+03)     ( 2.98e+03)
    	// x =  9 e^x =  8103.084  (8.103e+03)     (  8.1e+03)
    	// x = 10 e^x = 22026.466  (2.203e+04)     (  2.2e+04)
    	// x = 11 e^x = 59874.142  (5.987e+04)     ( 5.99e+04)
    

    注: %9.3f、%9.3[2]e或%9.3[2]g中9.3表示:宽度为9,小数点后保留3位,[2]表示重用Printf的第二个参数。宽度为该数值占用区域的最小宽度;精度为小数点后的位数。但是%g(%G),精度为数字的总和。

    1.6 重用参数

    fmt.Printf("%d %[1]o %#[1]o
    ",0666)
    

    通常Printf格式化参数包含多个%参数时,会包含同数量的操作数,%后的[1]告诉Printf函数再次使用第一个操作数

    1.7 字符串

        for i, r := range "Hello, 世界" {
    		fmt.Printf("%d	%q	%d
    ", i, r, r)
    	}
    	//output:
    	// 0       'H'     72
    	// 1       'e'     101
    	// 2       'l'     108
    	// 3       'l'     108
    	// 4       'o'     111
    	// 5       ','     44
    	// 6       ' '     32
    	// 7       '世'    19990
    	// 10      '界'    30028
    

    参考资料

  • 相关阅读:
    Codeforces467C George and Job
    Codeforces205E Little Elephant and Furik and RubikLittle Elephant and Furik and Rubik
    Codeforce205C Little Elephant and Interval
    51nod1829 函数
    51nod1574 排列转换
    nowcoder35B 小AA的数列
    Codeforce893E Counting Arrays
    gym101612 Consonant Fencity
    CodeForces559C Gerald and Giant Chess
    CodeForces456D A Lot of Games
  • 原文地址:https://www.cnblogs.com/xiwang/p/5912273.html
Copyright © 2011-2022 走看看