首页 > 开发 > Python > 正文

Python中使用format()函数对数字进行格式化

2023-04-25 12:32:02
字体:
来源:转载
供稿:网友

本站在《Python中使用format()函数格式化字符串》一文中介绍了format()函数的基本用法。在这篇文章中将继续介绍format()函数对数字进行格式化的方法。

关于format()函数的使用,本站共有3篇文章:

(1)Python中使用format()函数格式化字符串

(2)Python中使用format()函数对数字进行格式化

(3)Python中format()函数中的对齐与宽度问题

Python中使用format()函数格式化数字

使用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()函数格式化浮点数和小数类型

format()函数可以使用如下几种格式符格式化浮点数或小数类型。

类型 含义
'e'

输出数字的科学计数法形式。给定精度p,将数字格式化成以"e"分隔系数与指数的科学计数法形式。系数中小数点前有1位数字,小数点后有p位,共有p+1位有效数字。

若未指定精度,浮点(float)类型的小数点后会有6位数字,而小数类型(Decimal)会显示出所有数字。除非指定了“#”格式符,小数点后没有数字时,格式化后的数字将不会显示小数点。

'E' 输出科学计数法形式。作用与'e'相同,只不过使用大写的'E'来分隔系数和指数部分。
'f' 定点数表示法。给定精度 p ,将数字格式化为小数点后恰有 p 位的十进制数形式。若未给出精度,对于float型数据,小数点后使用6位数字的精度,而对于Decimal数据将使用足够大的精度来显示所有的小数部分;若小数点后没有数字,除非指定了“#”格式符,否则不会显示小数点。
'F' 定点数表示法。作用与‘f’相同,但是会把nan转换成NANinf转换成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-inf0-0nan

'G' 通用格式。与'g'相同,但当待格式化数字特别大时就会切换为'E',无穷大和NaN也会变为其大写形式。
'n' 数字格式,与'g'相同,但它使用当前区域的设置来插入适当的数字分隔符。
'%' 百分比。将待格式化的数字乘以100并以固定格式('f')进行显示,后面跟着一个“%”号。
None

对于float类型的数,其作用与'g'相同,除了以定点表示法格式化结果外,它总是包含小数点后至少一位数字。为了忠实地表示给定的值,所使用的精度也是尽可能大的。

对于Decimal类型的数,结合当前上下文十进制的值字母大小写情况,其作用与 'g' 或 'G' 相同。

其整体效果是匹配由其它格式修饰符修改的str()函数输出的结果。

下面分别举例说明这些格式符的基本使用情况:

1、f与F格式符的使用举例

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

2、使用e或E格式控制符

#未指定精度,使用小写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

3、g与G格式控制符的使用

#未指定精度且未超出默认的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。

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%
234.00%,23.40%
结果为:41.38%
从输出结果可以看出,第1个例子没有指定精度,小数点后有6位,在给定精度时,小数点后按照给定的精度输出。

输出带符号的数字字符串

在正常情况下,负数显示负号,正数不显示任何符号,但是根据实际需要,我们可以使用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()函数在格式化数字时各种情形下的使用情况,并用尽可能详尽的例子来讲解具体使用。如有问题请留言,也可以关注本站的公众号了解更多的内容。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表