String formatting¶
The conversion of Unit
and Quantity
objects to strings (e.g.
through the str
builtin or f-strings) can be customized using format
specifications. The basic format is:
[magnitude format][modifier][unit format]
where each part is optional and the order of these is arbitrary.
In case the format is omitted, the corresponding value in the object’s
.default_format
attribute (Quantity.default_format
or
Unit.default_format
) is filled in. For example:
In [1]: ureg = pint.UnitRegistry()
...: ureg.default_format = "~P"
...:
In [2]: u = ureg.Unit("m ** 2 / s ** 2")
...: f"{u}"
...:
Out[2]: 'm²/s²'
In [3]: u.default_format = "~C"
...: f"{u}"
...:
Out[3]: 'm**2/s**2'
In [4]: u.default_format, ureg.default_format
Out[4]: ('~C', '~P')
In [5]: q = ureg.Quantity(1.25, "m ** 2 / s ** 2")
...: f"{q}"
...:
Out[5]: '1.25 m²/s²'
In [6]: q.default_format = ".3fP"
...: f"{q}"
...:
Out[6]: '1.250 meter²/second²'
In [7]: q.default_format, ureg.default_format
Out[7]: ('.3fP', '~P')
Note
In the future, the magnitude and unit format spec will be evaluated
independently, such that with a global default of
ureg.default_format = ".3f"
and f"{q:P}
the format that
will be used is ".3fP"
. This behavior can be opted into by
setting UnitRegistry.separate_format_defaults
to True
.
If both are not set, the global default of "D"
and the magnitude’s default
format are used instead.
Note
Modifiers may be used without specifying any format: "~"
is a valid format
specification and is equal to "~D"
.
Unit Format Specifications¶
The Unit
class ignores the magnitude format part, and the unit format
consists of just the format type.
Let’s look at some examples:
In [8]: ureg = pint.UnitRegistry()
In [9]: u = ureg.kg * ureg.m / ureg.s ** 2
In [10]: f"{u:P}" # using the pretty format
Out[10]: 'kilogram·meter/second²'
In [11]: f"{u:~P}" # short pretty
Out[11]: 'kg·m/s²'
In [12]: f"{u:P~}" # also short pretty
Out[12]: 'kg·m/s²'
# default format
In [13]: u.default_format
Out[13]: ''
In [14]: ureg.default_format
Out[14]: ''
In [15]: str(u) # default: default
Out[15]: 'kilogram * meter / second ** 2'
In [16]: f"{u:~}" # default: short default
Out[16]: 'kg * m / s ** 2'
In [17]: ureg.default_format = "C" # registry default to compact
In [18]: str(u) # default: compact
Out[18]: 'kilogram*meter/second**2'
In [19]: f"{u}" # default: compact
Out[19]: 'kilogram*meter/second**2'
In [20]: u.default_format = "P"
In [21]: f"{u}" # default: pretty
Out[21]: 'kilogram·meter/second²'
In [22]: u.default_format = "" # TODO: switch to None
In [23]: ureg.default_format = "" # TODO: switch to None
In [24]: f"{u}" # default: default
Out[24]: 'kilogram * meter / second ** 2'
Unit Format Types¶
pint
comes with a variety of unit formats:
Spec |
Name |
Example |
---|---|---|
|
default |
|
|
pretty |
|
|
HTML |
|
|
latex |
|
|
latex siunitx |
|
|
compact |
|
Custom Unit Format Types¶
Using pint.register_unit_format()
, it is possible to add custom
formats:
In [25]: u = ureg.Unit("m ** 3 / (s ** 2 * kg)")
In [26]: @pint.register_unit_format("simple")
....: def format_unit_simple(unit, registry, **options):
....: return " * ".join(f"{u} ** {p}" for u, p in unit.items())
....:
In [27]: f"{u:~simple}"
Out[27]: 'm ** 3 * s ** -2 * kg ** -1'
where unit
is a dict
subclass containing the unit names and
their exponents.
Quantity Format Specifications¶
The magnitude format is forwarded to the magnitude (for a unit-spec of H
the
magnitude’s _repr_html_
is called).
Let’s look at some more examples:
In [28]: q = 1e-6 * u
# modifiers
In [29]: f"{q:~P}" # short pretty
Out[29]: '1×10⁻⁶ m³/kg/s²'
In [30]: f"{q:~#P}" # compact short pretty
Out[30]: '0.9999999999999999 mm³/g/s²'
In [31]: f"{q:P#~}" # also compact short pretty
Out[31]: '0.9999999999999999 mm³/g/s²'
# additional magnitude format
In [32]: f"{q:.2f~#P}" # short compact pretty with 2 float digits
Out[32]: '1.00 mm³/g/s²'
In [33]: f"{q:#~}" # short compact default
Out[33]: '0.9999999999999999 mm ** 3 / g / s ** 2'
Quantity Format Types¶
There are no special quantity formats yet.
Modifiers¶
Modifier |
Meaning |
Example |
---|---|---|
|
Use the unit’s symbol instead of its canonical name |
|
|
Call |
|