format输出中英文对齐

该博客介绍了如何使用自定义str类和__format__方法,解决Python中使用str.format()时中英文字符不对齐的问题。通过计算中英文字符的实际宽度,并调整格式化字符串的长度,实现了1:2的对齐效果。示例代码展示了对中文字符串'你好,123'和英文字符串'english-'进行对齐的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

str.format() 输出时使中英文按1:2对齐

分析

两个背景知识

  1. format函数会调用对象的__format__方法
  2. python 计算字符串的长度时,中文计算出来也是1

解决思路

  1. 对需要format对齐字符串时在对象外层再包含一层自定义str类,以实现对__format__函数的修改
  2. 想对齐中英文字符,计算出一个字符串中含有多少中文字符或者说计算出每个中英文字符在屏幕显示时所占有的宽度,计算出实际宽度后,令要对齐的字符串中<5s 5-(实际宽度-len(str)) 来弥补中文问宽度的差距,之后即正常格式化即可

代码

import re

class __MyStr__():
    def __init__(self, s) -> None:
        self.buff = ''+s

    def __str__(self):
        return self.buff.__str__()

    def __len__(self):
        return self.buff.__len__()

    def __add__(self, s):
        return __MyStr__(self.buff.__add__(s))

    def get_real_width(self):
        widths = [(126, 1), (159, 0), (687, 1), (710, 0), (711, 1), (727, 0), (733, 1), (879, 0),
                  (1154, 1), (1161, 0), (4347, 1), (4447, 2), (7467, 1), (7521, 0), (8369, 1), (8426, 0), (9000, 1), (9002, 2),
                  (11021, 1), (12350, 2), (12351, 1), (12438, 2), (12442, 0), (19893, 2), (19967, 1), (55203, 2), (63743, 1), (64106, 2),
                  (65039, 1), (65059, 0), (65131, 2), (65279, 1), (65376, 2), (65500, 1), (65510, 2), (120831, 1), (262141, 2), (1114109, 1),
                  (0xffffffffffffffffffffffffffffffff, 1)]
        length = 0
        for c in self.buff:
            o = ord(c)
            if o == 0xe or o == 0xf:
                continue
            for num, wid in widths:
                if o <= num:
                    length += wid
                    break
        return length

    def __format__(self, __format_spec: str) -> str:
        # *<4  *>5  *^5
        # *<4s *>5s *^5s
        # 4  4s
        format_spec = __format_spec
        format_len = int(re.findall('.*?[<^>]?([\d+]+)s?', format_spec)[0])
        format_len -= self.get_real_width()-len(self.buff)
        format_spec = re.sub('.*?[<^>]?([\d+]+)s?', str(format_len), format_spec)

        return self.buff.__format__(format_spec)


zw = '你好,123'
el = 'english-'
print('\n中英文无法对齐')
print('{0:15s} | '.format(zw))
print('{0:15s} | '.format(el))
print('\n中英文1:2对齐')
print('{0:15s} | '.format(__MyStr__(zw)))
print('{0:15s} | '.format(__MyStr__(el)))

结果

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值