2

我想使用标准的 format_spec 语法轻松格式化和左对齐作为浮点数加字符串的复合量(在我的情况下,字符串是度量单位)。

使用下划线表示消耗的空间

>>> print '{:<20.2f} {:s}'.format(1.0, 'kg/hr')
1.00_________________kg/hr

但我真正想要的是一种方便的生产方式:

1.00_kg/hr________________

此外,我希望总宽度成为widthformat_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 可以是标准格式函数中允许的任何内容,并且触发的任何标准错误都应该传播并为浮点部分正确报告。

有没有更聪明的方法?

4

2 回答 2

2

我可能会误解你,但这是你想要的吗?

>>> print '{:.2f} {:<20}'.format(1.0, 'kg/hr')
1.00_kg/hr_______________
于 2013-08-17T06:23:12.100 回答
0

要解决问题(在上面的评论中,传递单个字段),您可以尝试:

d = {'value':1.0, 'unit':'kg/hr'}
print '{value:.2f} {unit:<20}'.format(**d)

whered可能是您班级的字典成员。

另外,我只会过滤该值以仅接受浮点数。

于 2015-10-29T14:00:53.483 回答