Python收款凭证格式化:解决列错位排版问题的技术咨询
解决方案:Python收款凭证格式调整与数据结构化思路
一、数据结构化起步思路
必须把凭证数据拆分为结构化格式存储,推荐用字典列表存储面额明细,单独用字典存交易号、总计信息。这种方式能彻底分离数据与格式,后续调整格式、修改数据都更灵活,避免硬编码字符串的麻烦。
示例结构化数据:
# 交易号 transaction_no = "7487215638" # 面额明细:每个字典对应一条面额记录,extra字段存括号内的额外信息(可选) denomination_details = [ {"currency": "HUF", "denomination": 500, "pcs": 26, "amount": "13,000", "extra": "( 1) ( 500)"}, {"currency": "HUF", "denomination": 1000, "pcs": 28, "amount": "28,000", "extra": None}, {"currency": "HUF", "denomination": 2000, "pcs": 27, "amount": "54,000", "extra": "( 1) ( 2,000)"}, {"currency": "HUF", "denomination": 5000, "pcs": 15, "amount": "75,000", "extra": None}, {"currency": "HUF", "denomination": 10000, "pcs": 24, "amount": "240,000", "extra": None}, {"currency": "HUF", "denomination": 20000, "pcs": 10, "amount": "200,000", "extra": None}, ] # 总计信息 total_info = { "currency": "HUF", "total_pcs": 130, "total_amount": "610,000", "total_extra": "( 2) ( 2,500)" }
二、凭证格式调整实现
核心用Python的f-string对齐格式化,通过指定对齐方向(左/右/居中)和宽度,精准控制每列位置,解决CUR./DENOMI.列比PCS./AMOUNT列高一行的问题。
完整打印函数:
def print_receipt(transaction_no, details, total): # 打印居中的交易号,总宽度适配凭证长度 print(f"{'TRANSACTION NO. ' + transaction_no:^40}") print() # 打印CUR. DENOMI.表头 print(f"CUR. DENOMI.{'':<20}") # 遍历每条面额明细 for item in details: # 第一行:打印币种+面额,左对齐占10位 print(f"{item['currency']} {item['denomination']:<10}") # 第二行:打印PCS和AMOUNT,缩进后右对齐,控制列间距 print(f"{'':<10}{item['pcs']:>10}{item['amount']:>15}") # 若有额外信息,打印第三行 if item['extra']: print(f"{'':<10}{item['extra']}") # 打印分隔线 print("-" * 40) # 打印总计部分 print(f"{total['currency']:<10}") print(f" TOTAL{'':<5}{total['total_pcs']:>10}{total['total_amount']:>15}") print(f"{'':<10}{total['total_extra']}") # 调用函数生成凭证 print_receipt(transaction_no, denomination_details, total_info)
三、关键逻辑说明
- 列对齐控制:用
:<10(左对齐占10位)、:>10(右对齐占10位)、:^40(居中占40位)等格式符,确保每列位置固定; - 行结构对应:每条面额明细先打印
CUR./DENOMI.行,再打印PCS./AMOUNT行,天然实现“高一行”的视觉效果; - 扩展性:后续新增币种、调整列宽,只需修改格式化参数或结构化数据,无需重构整个打印逻辑。
内容的提问来源于stack exchange,提问作者Tamas
相关产品推荐
相关产品推荐

