Python 数字转中文大写金额:财务报销发票必备
Python 把 1234567.89 这种阿拉伯数字金额转成壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分,支持小数两位、零的处理,附完整代码。
场景痛点
写报销单、开发票、做合同时,金额既要写阿拉伯数字也要写中文大写,比如 ¥1234567.89 要写成"壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分"。手动写容易错,零的处理特别麻烦,比如 1001 是壹仟零壹元,不是壹仟零零壹。用 Python 写个转换函数,传数字直接出中文大写,财务报销、合同模板里都能用。
用到的库
# 纯 Python 实现,不需要第三方库
完整代码
# 数字位和单位的对应表
DIGITS = "零壹贰叁肆伍陆柒捌玖"
UNITS_INT = ["", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"]
UNITS_DEC = ["角", "分"]
def four_to_chinese(num):
"""把 0-9999 的整数转成中文,最多四位"""
s = str(num).zfill(4)
result = ""
zero_flag = False # 记录是否需要补一个零
for i, ch in enumerate(s):
d = int(ch)
unit = UNITS_INT[3 - i]
if d == 0:
zero_flag = True
else:
if zero_flag:
result += "零"
zero_flag = False
result += DIGITS[d] + unit
return result
def integer_to_chinese(integer):
"""把整数部分按亿、万、节分组转中文"""
if integer == 0:
return ""
s = str(integer)
# 从右往左每四位一组
groups = []
while s:
groups.append(s[-4:])
s = s[:-4]
# groups[0] 是个级,groups[1] 万级,groups[2] 亿级
suffixes = ["", "万", "亿", "万亿"]
result = ""
for i, g in enumerate(groups):
chunk = four_to_chinese(int(g))
if chunk:
result = chunk + suffixes[i] + result
return result
def money_to_chinese(amount):
"""把金额转成人民币中文大写"""
amount = round(float(amount) + 1e-9, 2)
integer = int(amount)
decimal = round((amount - integer) * 100)
jiao = decimal // 10
fen = decimal % 10
if integer == 0 and decimal == 0:
return "零元整"
parts = ""
if integer > 0:
parts += integer_to_chinese(integer) + "元"
if jiao == 0 and fen == 0:
parts += "整"
else:
if jiao > 0:
parts += DIGITS[jiao] + "角"
elif integer > 0:
parts += "零"
if fen > 0:
parts += DIGITS[fen] + "分"
return parts
def main():
tests = [0, 0.5, 0.05, 100, 1001, 10000, 1234567.89, 100000000, 20030405.67]
for n in tests:
print(f"{n:>15} -> {money_to_chinese(n)}")
if __name__ == "__main__":
main()
代码讲解
DIGITS把 0-9 映射成零壹贰叁肆伍陆柒捌玖。four_to_chinese处理一组最多四位数,连续的零只输出一个零,末尾的零不输出,这是大写金额的核心规则。integer_to_chinese把整数按四位一组切开,分别加万、亿单位,处理长金额。- 小数部分角、分两位:没有角分时补"整",有角无分写"X角整",都有才写"X角X分"。
round(amount + 1e-9, 2)消除浮点误差,比如 0.1+0.2=0.3000000004 这种问题。
运行结果
运行后打印一组测试用例: - 0 -> 零元整 - 100 -> 壹佰元整 - 1001 -> 壹仟零壹元整 - 1234567.89 -> 壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分 - 100000000 -> 壹亿元整
把 money_to_chinese 函数复制到自己的脚本里,传数字就能用。
注意事项
- 这个函数处理到万亿级,再大的数(如百万亿)要扩 UNITS_INT 和 suffixes。
- 财务规范里"整"字在没有角分时必须加,有角无分也建议加整,本函数按这个规则。
- 大写金额前面不要加"人民币"前缀,根据模板自己拼。
- 输入金额别超过 2 位小数,多余的小数会被 round 掉,不符合财务要求的金额先校验。
- 浮点金额有精度问题,实际财务建议传字符串或 Decimal,本示例为了简单用 float。

更新时间:2026-09-14 20:37:22
上一篇:Python 打开文件夹或用默认程序打开文件:跨平台方法