python - 在 `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 位小数显示。
解决方案
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>
推荐阅读
- c - 如何使用 sscanf 忽略并不总是存在的特定字符?
- sas - 如何使用 SAS 中一个表的值更新一系列表?
- swift - 如何冻结在 Swift 中创建的 Kotlin 对象?
- c - C 文字和溢出
- c# - 以编程方式在 C# 中格式化或对齐 CSHTML 文件的行
- sql-server - 与 64 位客户端的 Oracle 连接问题
- java - 如何理解Mysql上使用“explain”的结果中的“type”字段?
- python - Pandas drop_duplicates 偶尔会崩溃,无一例外
- python-3.x - Python - 导入csv文件并按列分组数字
- javascript - OnScroll 事件在内部以编程方式滚动时循环