因为宽度不够所以用空格来填充。函数为了实现字符串对齐,会在未达到指定长度的字符串末尾添上空格补齐。但是,问题在这里,它会填入ASCII码为20的space,也就是半角空格。它的长度等于每个字母或数字的宽度,但远比汉字的宽度小,所以导致补足后的字符串长度仍然不同。解决方案:重写一个格式对齐函数,函数中判断字符串是否是中文字符串,有的话则添加全角空格补齐,否则添加半角空格补齐。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的灵川网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
这篇文章主要介绍了Python中字符串对齐方法介绍,本文介绍Python字符串内置方法ljust、rjust、center的用法,需要的朋友可以参考下
目的
实现字符串的左对齐,右对齐,居中对齐。
方法
字符串内置了以下方法:其中width是指包含字符串S在内的宽度,fillchar默认是空格,也可以指定填充字符
代码如下:
string.ljust(s,
width[,
fillchar])
string.rjust(s,
width[,
fillchar])
string.center(s,
width[,
fillchar])
代码如下:
In
[6]:
a='Hello!'
In
[7]:
a.ljust(10,'+')
Hello!++++
In
[8]:
a.rjust(10,'+')
++++Hello!
In
[9]:
a.center(10,'+')
++Hello!++
这个看方法,这类问题基本没关注过,但是可以自己写一个对齐函数,对于同一列的数据把长度规定死就是几个字符的长度,这个长度必须涵盖最大的字符,小于这个长度的在两边自动填补空格,这样每列都像表格一样包裹在一个范围内自己就对齐了,直接用\b有一定的局限性,一旦四个字符补充不了就会偏左,有英文字符或者其他情况就会偏右,不好控制,每个字符再打打印前处理一下就OK,示例如下:
002-PG002-Python002 中英文混合字符串的对齐
最近几天在研究tkinter的颜色名称,准备写个能展示所有支持的颜色名的小程序。
做着做着发现一个问题,tkinter的listbox不支持多列的list,我那个表有6列,自己写一个class又好烦,于是就想到干脆加点竖线或者制表符排个版对齐一下,看着像表就行了。
于是又遇到一个问题,里面的中文名是我自己翻译的,有一些是中文+数字的组合,Python是对于汉字和英文都算作1个字符的,len('一二三abc')输出是6,而汉字和英文的宽度其实不一样,所以用format()和ljust()等函数都无法对齐,制表符在终端里是可以对齐的,但是tkinter迷之不认制表符,填进去完全没用。
然后去tkinter的listbox里测试下
于是自己写了个函数,给定一个字符串和需要的长度,计算一下汉字和字母的个数然后补空格。如下:
随便写个程序测试下
理论上讲应该是正确的,研究了下应该是中英文混排的时候,实际中文字宽不等于2倍英文字宽造成的,包括用全角空格和半角空格补充字符串混排也是对不齐的。
于是我就去找了个中英文混合等宽字体,微软雅黑与Consolas的混合:YaHei Consolas Hybrid,改上去。
顺便说一句,还有个【更纱黑体(Sarasa Gothic)】也不错,但英文太窄了看不习惯,想要的可以去GitHub找到。
完美,问题解决。
对于基本的字符串对齐操作,可以使用字符串的ljust(), rjust()和 center()方法。比如:
text = 'Hello World'
text.ljust(20)
'Hello World '
text.rjust(20)
' Hello World'
text.center(20)
' Hello World '
所有这些方法都能接受一个可选的填充字符。比如:
text.rjust(20,'=')
'=========Hello World'
text.center(20,'*')
'****Hello World*****'
函数 format()同样可以用来很容易的对齐字符串。 你要做的就是使用 或者 ^ 字符后面紧跟一个指定的宽度。比如:
format(text, '20')
' Hello World'
format(text, '20')
'Hello World '
format(text, '^20')
' Hello World '
如果你想指定一个非空格的填充字符,将它写到对齐字符的前面即可:
format(text, '=20s')
'=========Hello World'
format(text, '*^20s')
'****Hello World*****'
当格式化多个值的时候,这些格式代码也可以被用在 format()方法中。比如:
'{:10s} {:10s}'.format('Hello', 'World')
' Hello World'
format()函数的一个好处是它不仅适用于字符串。它可以用来格式化任何值,使得它非常的通用。 比如,你可以用它来格式化数字:
x = 1.2345
format(x, '10')
' 1.2345'
format(x, '^10.2f')
' 1.23 '
讨论
在老的代码中,你经常会看到被用来格式化文本的 % 操作符。比如:
'%-20s' % text
'Hello World '
'%20s' % text
' Hello World'
但是,在新版本代码中,你应该优先选择 format()函数或者方法。 format()要比 % 操作符的功能更为强大。 并且 format() 也比使用 ljust(), rjust()或 center()方法更通用, 因为它可以用来格式化任意对象,而不仅仅是字符串。
希望我的回答对你有帮助