鱼C论坛

 找回密码
 立即注册
查看: 2251|回复: 2

[技术交流] 字符串格式化语法参考

[复制链接]
发表于 2020-12-2 19:52:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
字符串格式化语法参考


本文所解锁的新知识,可以直接在字符串的 format() 方法上使用,也可以用于 Python3.6 新添加的 f-字符串。

来,先给大家看个厉害的:

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
复制代码

一脸懵?

那就对了,有继续看下去的必要了!

上面是字符串的标准格式化规范语法,看上去特别那个复杂……

但没关系,下面我们挨个儿举例给大家讲解。

首先是对齐([align])选项,对齐一共有 4 个值可供使用:

值        含义
'<'        强制字符串在可用空间内左对齐(默认)
'>'        强制字符串在可用空间内右对齐
'='        强制将填充放置在符号(如果有)之后但在数字之前(这适用于以 “+000000120” 的形式打印字符串)
'^'        强制字符串在可用空间内居中

既然要实现对齐,那么就需要指定一个更大的空间才行(否则没意义),我们可以通过宽度([width])选项来指定。

来,上例子:

>>> "{1:>10}{0:<10}".format(520, 250)
'       250520       '
复制代码

我们将位置索引和格式化语法使用冒号(:)进行分隔:


如果在指定宽度的前面添加一个 '0',则表示为数字类型(其它类型无效哦)启用感知正负号的 '0' 填充效果。

来,上例子:

>>> "{:010}".format(520)
'0000000520'
>>> "{:010}".format(-520)
'-000000520'
>>> "{:010}".format("FishC")
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    "{:010}".format("FishC")
ValueError: '=' alignment not allowed in string format specifier
复制代码

注:在 [width] 前添加 '0',相当于设置了 [fill] 为 '0',然后 [align] 设置为 '='

你还可以在对齐([align])选项的前面通过填充选项([fill])指定填充字符。

来,上例子:

>>> "{1:%>10}{0:%<10}".format(520, 250)
'%%%%%%%250520%%%%%%%'
复制代码

符号([sign])选项仅对数字类型有效,可以使用下面 3 个值:

值        含义
'+'        正数在前面添加正号(+),负数在前面添加负号(-)
'-'        只有负数在前面添加符号(-),默认行为
空格        正数在前面添加一个空格,负数在前面添加负号(-)

来,上例子:

>>> "{:+} {:-}".format(520, -250)
'+520 -250'
复制代码

除此之外,还可以设置千位分隔符,它有两个值可以选择 —— ',' 或 '_'

来,上例子:

>>> "{:,}".format(1234)
'1,234'
>>> "{:_}".format(1234)
'1_234'
>>> "{:,}".format(123)
'123'
>>> "{:,}".format(123456789)
'123,456,789'
复制代码

注:如果希望采用当前语言环境设置的分隔符,请采用类型([type])的 'n'

精度([.precision])选项是一个十进制整数,对于不同类型的参数,它的效果是不一样的:

对于以 'f' 或 'F' 格式化的浮点数值来说,是限定小数点后显示多少个数位
对于以 'g' 或 'G' 格式化的浮点数值来说,是限定小数点前后共显示多少个数位
对于非数字类型来说,限定最大字段的大小(换句话说就是要使用多少个来自字段内容的字符)
对于整数来说,则不允许使用该选项值

来,上例子:

>>> "{:.2f}".format(3.1415)
'3.14'
>>> "{:.2g}".format(3.1415)
'3.1'
>>> "{:.6}".format("I love FishC")
'I love'
>>> "{:.2}".format(520)
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    "{:.2}".format(520)
ValueError: Precision not allowed in integer format specifier
复制代码

最后,类型([type])选项决定了数据应该如何呈现。

以下类型适用于整数:

值        含义
'b'        将参数以二进制的形式输出
'c'        将参数以 Unicode 字符的形式输出
'd'        将参数以十进制的形式输出
'o'        将参数以八进制的形式输出
'x'        将参数以十六进制的形式输出
'X'        将参数以十六进制的形式输出
'n'        跟 'd' 类似,不同之处在于它会使用当前语言环境设置的分隔符插入到恰当的位置
None        跟 'd' 一样

来,上例子:

>>> "{:b}".format(80)
'1010000'
>>> "{:c}".format(80)
'P'
>>> "{:d}".format(80)
'80'
>>> "{:o}".format(80)
'120'
>>> "{:x}".format(80)
'50'
>>> "{:n}".format(80)
'80'
复制代码

注:十进制数 80 对应的二进制数是 1010000,对应的 Unicode 字符是 P,对应的八进制数是 120,对应的十六进制数是 50

这还有个人性化设置,就是井号([#])选项,参数以二进制、八进制或十六进制在字符串中输出的时候,会自动追加前缀 "0b"、"0o" 和 "0x"。

来,上例子:

>>> "{:#b}".format(80)
'0b1010000'
>>> "{:#o}".format(80)
'0o120'
>>> "{:#x}".format(80)
'0x50'
复制代码

以下类型值适用于浮点数、复数和整数(自动转换为等值的浮点数)如下:

值        含义
'e'        将参数以科学记数法的形式输出(以字母 'e' 来标示指数,默认精度为 6)
'E'        将参数以科学记数法的形式输出(以字母 'E' 来标示指数,默认精度为 6)
'f'        将参数以定点表示法的形式输出(“不是数” 用 'nan' 标示,无穷用 'inf' 标示,默认精度为 6)
'F'        将参数以定点表示法的形式输出(“不是数” 用 'NAN' 标示,无穷用 'INF' 标示,默认精度为 6)
'g'        通用格式,小数以 'f' 形式输出,大数以 'e' 的形式输出
'G'        通用格式,小数以 'F' 形式输出,大数以 'E' 的形式输出示
'n'        跟 'g' 类似,不同之处在于它会使用当前语言环境设置的分隔符插入到恰当的位置
'%'        以百分比的形式输出(将数字乘以 100 并显示为定点表示法('f')的形式,后面附带一个百分号
None        类似于 'g',不同之处在于当使用定点表示法时,小数点后将至少显示一位;默认精度与给定值所需的精度一致

注:% 不适用于复数

来,上例子:

>>> "{:e}".format(3.1415)
'3.141500e+00'
>>> "{:E}".format(3.1415)
'3.141500E+00'
>>> "{:f}".format(3.1415)
'3.141500'
>>> "{:g}".format(123456789)
'1.23457e+08'
>>> "{:g}".format(1234.56789)
'1234.57'
>>> "{:%}".format(0.98)
'98.000000%'
复制代码

更灵活的玩法

Python 事实上支持通过关键参数来设置选项的值,比如下面代码通过参数来调整输出的精度:

>>> "{:.{prec}f}".format(3.1415, prec=2)
'3.14'
复制代码

同时设置多个选项也是没问题的,只要你自己不乱,Python 就不会乱:

>>> "{:{fill}{align}{width}.{prec}{type}}".format(3.1415, fill='+', align='^', width=10, prec=3, type='g')
'+++3.14+++'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 06:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表