字符串格式化{}的用法

Python
Python 中字符串格式化{}的用法,特别是.format()和 f-string 中使用的格式说明符(Format Specification Mini-Language)。
发布于

2025年9月28日

🌟 一、字符串格式化方法概览

Python 提供了多种字符串格式化方式:

  1. .format() 方法(推荐,灵活)
  2. f-string(Python 3.6+,最现代、高效)
  3. % 格式化(旧式,不推荐)

本文重点讲解 {}.format() 和 f-string 中的 格式说明符语法


🧩 二、{} 中的格式说明符语法结构

完整的格式说明符语法如下:

{:[fill][align][sign][#][0][width][,][.precision][type]}

注:: 之后的部分统称为 format_spec

各部分可选,顺序固定。我们逐个讲解。


1️⃣ fill:填充字符(可选)

  • 作用:当字段宽度大于内容时,用指定字符填充空白。
  • 默认是空格。
  • 如果要指定非空格填充,必须与 align 一起使用。

示例:

'{:.<10}'.format(123)     # '123.......' 用点填充
'{:_^10}'.format('hi')    # '___hi____' 居中,用下划线填充
'{:0>5}'.format(42)       # '00042' 右对齐,用0填充

⚠️ 注意:如果 fill 不是空格,必须紧接着 align(即 <, >, ^, =


2️⃣ align:对齐方式(可选)

符号 含义
< 左对齐(Left)
> 右对齐(Right)
^ 居中对齐(Center)
= 数值类型专用:符号在左,填充在中间(如 +000123

示例:

'{:<10}'.format('abc')   # 'abc       ' 左对齐
'{:>10}'.format('abc')   # '       abc' 右对齐
'{:^10}'.format('abc')   # '   abc    ' 居中
'{:=+8d}'.format(123)    # '+   123' 符号左,填充居中

3️⃣ sign:正负号显示方式(仅数字)

符号 含义
+ 正数显示 +,负数显示 -
- 负数显示 -,正数不显示符号(默认)
空格 正数前加空格,负数显示 -

示例:

'{:+d}'.format(123)      # '+123'
'{:+d}'.format(-123)     # '-123'
'{: d}'.format(123)      # ' 123'(空格)
'{: d}'.format(-123)     # '-123'

4️⃣ #:替代形式(Alternate form)

用于某些类型显示前缀:

类型 作用
b 二进制:加 0b 前缀
o 八进制:加 0o 前缀
x/X 十六进制:加 0x/0X 前缀
g/G 保留末尾的0

示例:

'{:#b}'.format(10)       # '0b1010'
'{:#o}'.format(10)       # '0o12'
'{:#x}'.format(255)      # '0xff'
'{:#X}'.format(255)      # '0xFF'

5️⃣ 0:零填充(等价于 fill=0 + align=

  • 如果 width 前有 0,表示用 0 填充。
  • 常用于日期、编号等。

示例:

'{:08d}'.format(123)     # '00000123'
'{:06.2f}'.format(3.1)   # '003.10' 总宽6,保留2位小数

6️⃣ width:最小字段宽度(可选)

  • 表示该字段至少占多少个字符宽度。
  • 如果内容不足,按 align 规则填充。
  • 如果内容更长,则按实际长度显示(不会截断)。

示例:

'{:10}'.format('hi')     # 'hi        '(右对齐,默认)
'{:<10}'.format('hi')    # 'hi        '(左对齐)
'{:>10}'.format('hi')    # '        hi'

7️⃣ ,:千位分隔符(Thousands Separator)

  • 用于大数字,每三位加逗号。
  • 也可用 _(Python 3.6+ 支持)

示例:

'{:,d}'.format(1234567)  # '1,234,567'
'{:_d}'.format(1234567)  # '1_234_567'(用下划线)
'{:,.2f}'.format(1234.5) # '1,234.50'

8️⃣ .precision:精度(小数位数或最大长度)

  • 浮点数:表示小数点后保留几位。
  • 字符串:表示最多显示多少个字符(超出则截断)。

示例(浮点数):

'{:.2f}'.format(3.14159) # '3.14'
'{:.0f}'.format(3.7)     # '4'(四舍五入)

示例(字符串):

'{:.3s}'.format('hello') # 'hel'(只取前3个字符)

9️⃣ type:数据类型(最关键)

类型 含义 示例
d 十进制整数 {:d}123
b 二进制 {:b}1111011
o 八进制 {:o}173
x 小写十六进制 {:x}7b
X 大写十六进制 {:X}7B
f 浮点数 {:f}3.141593
F 浮点数(支持 INF, NAN {:F}
e 科学计数法(小写) {:e}1.23e+04
E 科学计数法(大写) {:E}1.23E+04
g 自动选择 fe {:g}
G 自动选择 FE {:G}
% 百分比(×100 + % {:.2%}49.67%
s 字符串(默认) {:s}'abc'
n 数字(带本地化分隔符) {:n}

示例:

'{:b}'.format(10)        # '1010'
'{:x}'.format(255)       # 'ff'
'{:.2e}'.format(1234.5)  # '1.23e+03'
'{:.2%}'.format(0.123)   # '12.30%'

🧪 三、综合示例

value = 1234.567

# 各种组合
print('{:0>10,.2f}'.format(value))     # '001,234.57' 右对齐,0填充,千分位,2位小数
print('{:^15.1f}'.format(value))       # '    1234.6     ' 居中,宽度15,1位小数
print('{:+.2%}'.format(0.876))         # '+87.60%' 正号,百分比,2位小数
print('{:#010x}'.format(255))          # '0x000000ff' 十六进制,0填充到10位,含0x
print('{:.5s}'.format('Hello World'))  # 'Hello' 截断为5字符

✅ 四、f-string 中的用法(推荐)

f-string 语法更简洁,功能完全相同:

name = 'Alice'
score = 87.6
pi = 3.1415926

f'{name:>10}'            # '     Alice'
f'{score:.1f}'           # '87.6'
f'{pi:.3f}'              # '3.142'
f'{score:.2%}'           # '8760.00%' ❌ 注意:score 是 87.6,不是 0.876
f'{score/100:.2%}'       # '87.60%' ✅

📌 五、常见陷阱与建议

  1. % 百分比是 ×100 的:传入的是小数(如 0.5),不是百分数(如 50)。
  2. width 是最小宽度:内容长了不会截断。
  3. fillalign 必须一起用:不能只写 {:a>5},要写 {:a>5}
  4. .precision 对字符串是截断,对浮点是四舍五入

📘 六、官方文档参考

Python 官方文档中称为 “Format Specification Mini-Language”

👉 https://docs.python.org/3/library/string.html#format-specification-mini-language


✅ 总结:常用格式速查表

需求 格式符 示例
千位分隔整数 :,d 1,234,567
保留2位小数 :.2f 3.14
百分比(2位小数) :.2% 49.67%
左对齐宽度10 :<10 abc_______
右对齐0填充 :06d 000123
二进制 :b 1010
十六进制 :x:X ffFF
居中宽度10 :^10} ___abc____

如果你有具体的应用场景(比如格式化金额、日期、表格对齐等),我可以给出更针对性的例子!欢迎继续提问 😊