本站在《Python中使用format()函数格式化字符串》一文中介绍了format()函数的基本用法。在这篇文章中将继续介绍format()函数对数字进行格式化的方法。
关于format()函数的使用,本站共有3篇文章:
(1)Python中使用format()函数格式化字符串
(2)Python中使用format()函数对数字进行格式化
(3)Python中format()函数中的对齐与宽度问题
在format()函数中,可以使用不同的字符指示符可以将整型数据转换成不同的形式,如输出其对应的二进制形式、八进制形式等。
Python中提供了如下几种格式控制符
类型 | 含义 |
---|---|
'b' | 二进制格式。输出以2为基的数字 |
'c' | 字符格式。输出数字对应的Unicode字符。 |
'd' | 十进制格式。输出以10为基的数字。 |
'o' | 八进制格式。输出以8为基的数字。 |
'x' | 十六进制格式。使用小写字符表示9以上的数字。 |
'X' | 十六进制格式。使用大写字符表示9以上的数字。如果格式符中指定了'#'指示符,则十六进制的前缀'0x'也会变成对应的大写形式'0X'。 |
'n' | 数字格式,与'd'相同,但它使用当前区域的设置来插入适当的数字分隔符。 |
None | 作用与'd'相同。 |
下面举几个例子来说明其使用方法:
#格式化整型数字
num = 78
print("bin:{0:b}".format(num)) #二进制
print("hex:{0:x}".format(num)) #十六进制,字母小写
print("Hex:{0:X}".format(num)) #十六进制,字母大写
print("int:{0:d}".format(num)) #整型数字
print("oct:{0:o}".format(num)) #八进制数字
print("uchar:{0:c}".format(num)) #输出对应的Unicode字符
其输出结果如下:
bin:1001110
hex:4e
Hex:4E
int:78
oct:116
uchar:N
从输出结果中,我们注意到对应的二进制、十六进制和八进制前面并没有任何前缀。如果需要输出前缀需要借助“#”格式指示符。下面对“#”进行专门介绍。
"#"指示符控制数字转换格式的形式。不同的转换类型,其样式会有不同。该选项仅适用于整型、浮点类型、负数和小数类型。对于整型数据,当输出格式为二进制、八进制、十六进制时,该指示符会在其输出值前分别添加'0b','0o','0x'。对于浮点数、复数或小数来讲,该指示符会使输出值始终包含小数点,即使小数点后没有其它内容也会输出小数点。通常情况下,小数点后包含一个数字时才会出现小数点。
下面举例子说明:
# '#'格式符的使用
print("bin:{0:#b}".format(26))
print("hex:{0:#x}".format(26))
print("Hex:{0:#X}".format(26))
print("oct:{0:#o}".format(26))
print("int:{0:#d}".format(26))
print("complex:{0:#}".format(3+8j))
输出结果如下:
bin:0b11010
从以上例子可以看出,使用了“#”格式符后,输出的二进制、八进制和十六进制前面都加了前缀,而对十进制整数没有影响。对于复数,即使实部和虚部都是整数时,在使用了“#”格式符后,其输出的实部和虚部都含有小数点,即使小数点后再没有其它数字亦是如此。
hex:0x1a
Hex:0X1A
oct:0o32
int:26
complex:(3.+8.j)
format()函数可以使用如下几种格式符格式化浮点数或小数类型。
类型 | 含义 |
---|---|
'e' |
输出数字的科学计数法形式。给定精度p,将数字格式化成以"e"分隔系数与指数的科学计数法形式。系数中小数点前有1位数字,小数点后有p位,共有p+1位有效数字。 若未指定精度,浮点(float)类型的小数点后会有6位数字,而小数类型(Decimal)会显示出所有数字。除非指定了“#”格式符,小数点后没有数字时,格式化后的数字将不会显示小数点。 |
'E' | 输出科学计数法形式。作用与'e'相同,只不过使用大写的'E'来分隔系数和指数部分。 |
'f' | 定点数表示法。给定精度 p ,将数字格式化为小数点后恰有 p 位的十进制数形式。若未给出精度,对于float型数据,小数点后使用6位数字的精度,而对于Decimal数据将使用足够大的精度来显示所有的小数部分;若小数点后没有数字,除非指定了“#”格式符,否则不会显示小数点。 |
'F' | 定点数表示法。作用与‘f’相同,但是会把nan转换成NAN,inf转换成INF。 |
'g' |
通用格式。对于给定p >= 1的精度,将数字圆整为p位有效数字,然后将结果格式化为定点数格式或科学计数法格式(这完全取决于待格式化数字的大小)。精度为0时将按精度为1时对待。具体规则如下: 假设以类型'e'和精度p-1对数字实施格式化时,其指数为exp。那么,如果 m <= exp < p ,这里待格式化的数为float类型时m=-4,待格式化的数为Decimal(小数)时,m=-6,则数字将以类型'f'和精度 p-1-exp被格式化。否则,数字将以类型'e'和精度p-1实施格式化。两种情况下,小数尾部的0将被删除,且在未指定"#"格式选项时,小数部分若没有数字,小数点也将被移除。 在未给定精度时,浮点数(float)默认使用6位有效数字的精度。对于Decimal型数值,格式化结果的系数由值系数的位数组成;科学计数法用于绝对值小于1e-6的数和最小有效位数大于1的数,否则将使用定点数表示法。 无论设定什么样的精度,正负无穷大、正负0,以及nan将分别被格式化为inf、-inf、0、-0 和 nan。 |
'G' | 通用格式。与'g'相同,但当待格式化数字特别大时就会切换为'E',无穷大和NaN也会变为其大写形式。 |
'n' | 数字格式,与'g'相同,但它使用当前区域的设置来插入适当的数字分隔符。 |
'%' | 百分比。将待格式化的数字乘以100并以固定格式('f')进行显示,后面跟着一个“%”号。 |
None |
对于float类型的数,其作用与'g'相同,除了以定点表示法格式化结果外,它总是包含小数点后至少一位数字。为了忠实地表示给定的值,所使用的精度也是尽可能大的。 对于Decimal类型的数,结合当前上下文十进制的值字母大小写情况,其作用与 'g' 或 'G' 相同。 其整体效果是匹配由其它格式修饰符修改的str()函数输出的结果。 |
下面分别举例说明这些格式符的基本使用情况:
import math
#未指定精度时,默认小数点后为6位
print("f格式未指定精度:{:f}".format(10.23))
#指定精度为4,小数点后未达到4位时,后边补0
print("f格式指定精度为4:{:.4f}".format(10.23))
#指定精度为4,效果与上面相同
print("F格式指定精度为4:{:.4F}".format(10.23))
#指定精度为4,小数点后数位超出4时,进行四舍五入
print("f格式指定精度为4:{:.4f}".format(10.23456))
#指定精度为4,效果与上面相同
print("F格式指定精度为4:{:.4F}".format(10.23456))
#f格式,输出小写inf
print("f格式输出inf:{:f}".format(math.inf))
#F格式,输出大写INF
print("F格式输出INF:{:F}".format(math.inf))
输出结果如下:
f格式未指定精度:10.230000
f格式指定精度为4:10.2300
F格式指定精度为4:10.2300
f格式指定精度为4:10.2346
F格式指定精度为4:10.2346
f格式输出inf:inf
F格式输出INF:INF
#未指定精度,使用小写e输出科学计数形式,数值部分保留6位小数
print("e格式未指定精度:{:e}".format(12.345))
#未指定精度,使用大写E输出科学计数形式,数值部分保留6位小数
print("E格式未指定精度:{:E}".format(12.345))
#指定精度,数值部分不足6位时,后面补0
print("e格式指定精度为4:{:.5e}".format(12.345))
#指定精度,数值部分超过精度规定的小数位数时,进行四射五入
print("E格式指定精度为2:{:.2E}".format(12.345))
输出结果如下:
e格式未指定精度:1.234500e+01
E格式未指定精度:1.234500E+01
e格式指定精度为4:1.23450e+01
E格式指定精度为2:1.23E+01
#未指定精度且未超出默认的6位有效数字时,原样输出
print("g格式未指定精度-1:{:g},{:g},{:g}".format(12.345,12.3456,0.123456))
#未指定精度,整数部分未达到6位有效数字,四舍五入
print("g格式未指定精度-2:{:g},{:g},{:g}".format(123.34567,123456.7,0.0001))
#整数部分超出6位有效数字或浮点数绝对值≤1e-5时
print("g格式未指定精度-3:{:g},{:g},{:g}".format(1234567,1234567.5,0.00001))
#指定精度时的各种情形
print("g格式指定精度-1:{:.5g},{:.5g},{:.5g}".format(12.345,12.3456,0.123456))
print("g格式指定精度-2:{:.5g},{:.5g},{:.5g}".format(123.34567,123456.7,0.0001))
print("g格式指定精度-3:{:.5g},{:.5g},{:.5g}".format(1234567,1234567.5,0.00001))
#g与G格式的对比
print("{:g},{:G},{:g},{:G},{:g},{:G}".format(1234567.8,1234567.8,
math.inf,math.inf,
math.nan,math.nan))
输出结果如下:
g格式未指定精度-1:12.345,12.3456,0.123456
g格式未指定精度-2:123.346,123457,0.0001
g格式未指定精度-3:1.23457e+06,1.23457e+06,1e-05
g格式指定精度-1:12.345,12.346,0.12346
g格式指定精度-2:123.35,1.2346e+05,0.0001
g格式指定精度-3:1.2346e+06,1.2346e+06,1e-05
1.23457e+06,1.23457E+06,inf,INF,nan,NAN
在Python中,带小数点的数默认为float类型,所以在使用g格式控制输出时,若数的绝对值小于或等于1e-5时将使用科学计数法形式输出,即语法中的m取值应为-4。
print("{:%},{:%}".format(2.34,0.234))
print("{:.2%},{:.2%}".format(2.34,0.234))
num1 = 12
num2 = 29
print("结果为:{:.2%}".format(num1 / num2))
输出结果如下:
234.000000%,23.400000%
从输出结果可以看出,第1个例子没有指定精度,小数点后有6位,在给定精度时,小数点后按照给定的精度输出。
234.00%,23.40%
结果为:41.38%
在正常情况下,负数显示负号,正数不显示任何符号,但是根据实际需要,我们可以使用format()函数控制正负号的显示情况。
在format()函数中,用于控制数字符号格式的格式控制符有以下3个:
类型 | 含义 |
---|---|
'+' | 指示正负数都要显示符号。 |
'-' | 指示只有负数才显示符号(默认)。 |
space | 正数使用前导空格,负数使用负号。 |
下面举例子说明其具体使用方法:
#正负数都显示符号
print("正负数都显示符号:{:+f},{:+f}".format(521.1314,-521.1314))
#只有负数显示符号
print("只有负数显示符号:{:-f},{:-f}".format(521.1314,-521.1314))
#不使用符号控制符
print("不使用控制符结果:{:f},{:f}".format(521.1314,-521.1314))
#使用空格,正数前有空格
print("使用空格控制结果:{: f},{: f}".format(521.1314,-521.1314))
输出结果:
正负数都显示符号:+521.131400,-521.131400
只有负数显示符号:521.131400,-521.131400
不使用控制符结果:521.131400,-521.131400
使用空格控制结果: 521.131400,-521.131400
在以上输出结果中注意最后一个当中正数前面有一个空格,负数前是没有的。
千位分隔符在金融领域运用较多,以增强数字的可读性,其是在Python 3.1版中新增加进来的格式控制符。
下面举例说明:
print("{:,}".format(1234567890))
输出结果:
1,234,567,890
在Python3.6版本中还新增了另外一种数位分隔符:_(下划线)。
下划线在数字中没有实际意义,只是作为数位分隔符。在一些数据中添加这个符号以增加可读性,如十六进制、二进制等。
print("{:_}".format(1234567890)) #十进制数
print("{:_X}".format(0X12EAF7B8)) #十六进制数
print("{:_b}".format(123456)) #二进制格式
print("{:_o}".format(123454)) #八进制
输出结果:
1_234_567_890
12EA_F7B8
1_1110_0010_0100_0000
36_1076
从上面的输出结果可以看出,对于十进制数,其仍然是每3位加一个下划线,而二进制、八进制和十六进制是每隔4个添加一个下划线。
format()函数用于复数
使用format()函数可以方便的获取复数的实部与虚部值。
com_num = 12 + 34j
print("实部:{0.real},虚部:{0.imag}".format(com_num))
输出结果:
实部:12.0,虚部:34.0
以上详细讲解了format()函数在格式化数字时各种情形下的使用情况,并用尽可能详尽的例子来讲解具体使用。如有问题请留言,也可以关注本站的公众号了解更多的内容。
新闻热点
疑难解答