首页 > 解决方案 > 在 `pint` 中,设置每个单元的 `default_format`

问题描述

基本上是标题。在pint中,有没有办法定义每个维度每个单元的默认字符串格式,而不是“全面”?

更准确地说:我想根据其物理单位格式化一个数量的数值(即大小)。

这是我尝试过的,基于文档中显示的代码:

from pint import UnitRegistry, Unit
ureg = UnitRegistry()

# Specific format for km won't stick...
ureg.default_format = ".0f~"
ureg.km.default_format = ".2fP"
ureg.km.default_format  # '.0f~'

# ...as also seen here:
dist = 3 * ureg("km")
time = 500 * ureg("s")
print(f"{dist}, {time}")
# wanted: 3.00 kilometer, 500 s
# got:    3 km, 500 s

尤其是在处理价格时,可以设置 2 位默认值,而所有其他单位具有不同的默认格式。

PS:我知道可以为单个数量(例如dist.default_format = '.2f~')设置默认格式,但这对我的用例来说太具体了。我希望以 'km' 为单位的所有数量都以 2 位小数显示。

标签: pythonformattingpint

解决方案


I have constructed quite the hacky solution:

from pint import UnitRegistry, Quantity
ureg = UnitRegistry()

# Setting specific formats:
formatdict = {ureg.km: '.2fP'} # extend as required
Quantity.default_format = property(lambda self: formatdict.get(self.u, ".0f~"))

# Works:
dist = 3 * ureg("km")
time = 500 * ureg("s")
print(f"{dist}, {time}")  # 3.00 kilometer, 500 s

This works, but I'd be surprised if there isn't a better solution.


EDIT

It only works in a limited sense. ureg.default_format gets changed as well, which prohibits its use in e.g. a pandas.DataFrame:

ureg.default_format  # <property at 0x21148ed5ae0>

推荐阅读