我想使用标准的 format_spec 语法轻松格式化和左对齐作为浮点数加字符串的复合量(在我的情况下,字符串是度量单位)。
使用下划线表示消耗的空间:
>>> print '{:<20.2f} {:s}'.format(1.0, 'kg/hr')
1.00_________________kg/hr
但我真正想要的是一种方便的生产方式:
1.00_kg/hr________________
此外,我希望总宽度成为width
format_spec 的组成部分,在本例中为 20(但我想要一个通用解决方案)。在我上面的错误示例中,结果的最终宽度实际上是 26,因为 20 完全是为浮点数保留的。
我已经搜索了 Google 和 SO,但没有找到任何东西。我的后备方案是编写一个 hacky format_spec 解析器来过滤掉浮点格式化部分,应用它使浮点变成一个字符串,然后重建一个新的 format_spec,我将它应用于两者的连接。我__format__()
在一个类中重写,所以我在调用时收到 format_spec '{:<20.2f}'.format(my_obj)
(my_obj
内部包含测量单位,必须在__repr__()
调用时显示)。建议的伪代码:
def __format__(self, format_spec):
float_spec = extract_float_part(format_spec)
# Using the example above, float_spec becomes '.2f'
float_str = string.format(float_value, float_spec)
# Using example, float_str becomes '1.00'
new_format_spec = make_new_format_spec(format_spec)
# Using example, new_format_spec should become '<20s'
output = string.format(' '.join([float_str, unit_str]), new_format_spec)
我真的不想写(也不必维护)extract_float_part()
和make_new_format_spec()
. 对于一部分案例(例如,检测并在期间拆分等)很容易做到,但我担心会有很多极端案例,我将不得不添加很多样板来处理他们。一般来说,format_spec 可以是标准格式函数中允许的任何内容,并且触发的任何标准错误都应该传播并为浮点部分正确报告。
有没有更聪明的方法?