String formatting specification

The conversion of Unit, Quantity and Measurement 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][pint format]

where each part is optional and the order of these is arbitrary.

>>> import pint
>>> ureg = pint.UnitRegistry()
>>> q = 2.3e-6 * ureg.m ** 3 / (ureg.s ** 2 * ureg.kg)
>>> f"{q:~P}"  # short pretty
'2.3×10⁻⁶ m³/kg/s²'
>>> f"{q:~#P}"  # compact short pretty
'2.3 mm³/g/s²'
>>> f"{q:P#~}"  # also compact short pretty
'2.3 mm³/g/s²'
>>> f"{q:.2f~#P}"  # short compact pretty with 2 float digits
'2.30 mm³/g/s²'
>>> f"{q:#~}"  # short compact default
'2.3 mm ** 3 / g / s ** 2'

In case the format is omitted, the corresponding value in the formatter .default_format attribute is filled in. For example:

>>> ureg.formatter.default_format = "P"
>>> f"{q}"
'2.3×10⁻⁶ meter³/kilogram/second²'

Pint Format Types

pint comes with a variety of unit formats. These impact the complete representation:

Spec

Name

Examples

D

default

3.4e+09 kilogram * meter / second ** 2

P

pretty

3.4×10⁹ kilogram·meter/second²

H

HTML

3.4×10<sup>9</sup> kilogram meter/second<sup>2</sup>

L

latex

3.4\\times 10^{9}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}

Lx

latex siunitx

\\SI[]{3.4e+09}{\\kilo\\gram\\meter\\per\\second\\squared}

C

compact

3.4e+09 kilogram*meter/second**2

These examples are using g` as numeric modifier. Measurement are also affected by these modifiers.

Quantity modifiers

Modifier

Meaning

Example

#

Call Quantity.to_compact() first

1.0 m·mg/s² (f"{q:#~P}")

Unit modifiers

Modifier

Meaning

Example

~

Use the unit’s symbol instead of its canonical name

kg·m/s² (f"{u:~P}")

Magnitude modifiers

Pint uses the format specifications. However, it is important to remember that only the type honors the locale. Using any other numeric format (e.g. g, e, f) will result in a non-localized representation of the number.

Custom formats

Using pint.register_unit_format(), it is possible to add custom formats:

>>> @pint.register_unit_format("Z")
... def format_unit_simple(unit, registry, **options):
...     return " * ".join(f"{u} ** {p}" for u, p in unit.items())
>>> f"{q:Z}"
'2.3e-06 kilogram ** -1 * meter ** 3 * second ** -2'

where unit is a dict subclass containing the unit names and their exponents, registry is the current instance of :py:class:UnitRegistry and options is not yet implemented.

You can choose to replace the complete formatter. Briefly, the formatter if an object with the following methods: format_magnitude, format_unit, format_quantity, format_uncertainty, format_measurement. The easiest way to create your own formatter is to subclass one that you like.

>>> from pint.delegates.formatter.plain import DefaultFormatter
>>> class MyFormatter(DefaultFormatter):
...
...      default_format = ""
...
...      def format_unit(self, unit, uspec, sort_func, **babel_kwds) -> str:
...          return "ups!"
...
>>> ureg.formatter = MyFormatter()
>>> ureg.formatter._registry = ureg
>>> str(q)
'2.3e-06 ups!'

By replacing other methods, you can customize the output as much as you need.