pythonpython-3.xstringf-string

f-string formatting: display number sign?


Basic question about python f-strings, but couldn't find out the answer: how to force sign display of a float or integer number? i.e. what f-string makes 3 displayed as +3?


Solution

  • From Docs:

    Option Meaning
    '+' indicates that a sign should be used for both positive as well as negative numbers.
    '-' indicates that a sign should be used only for negative numbers (this is the default behavior).

    Example from docs:

    >>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
    '+3.140000; -3.140000'
    >>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
    '3.140000; -3.140000'
    >>> '{:+} {:+}'.format(10, -10)
    '+10 -10'
    

    Above examples using f-strings:

    >>> f'{3.14:+f}; {-3.14:+f}'
    '+3.140000; -3.140000'
    >>> f'{3.14:-f}; {-3.14:-f}'
    '3.140000; -3.140000'
    >>> f'{10:+} {-10:+}'
    '+10 -10'
    

    One caveat while printing 0 as 0 is neither positive nor negative. In python, +0 = -0 = 0.

    >>> f'{0:+} {-0:+}'
    '+0 +0'
    >>> f'{0.0:+} {-0.0:+}'
    '+0.0 -0.0'
    

    0.0 and -0.0 are different objects1.

    In some computer hardware signed number representations, zero has two distinct representations, a positive one grouped with the positive numbers and a negative one grouped with the negatives; this kind of dual representation is known as signed zero, with the latter form sometimes called negative zero.

    Update: From Python 3.11 and above, allows negative floating point zero as positive zero.

    The 'z' option coerces negative zero floating-point values to positive zero after rounding to the format precision. This option is only valid for floating-point presentation types.

    Example from PEP682:

    >>> x = -.00001
    >>> f'{x:z.1f}' '0.0'
    
    >>> x = decimal.Decimal('-.00001')
    >>> '{:+z.1f}'.format(x) '+0.0' 
    

    1. Negative 0 in Python. Also check out Signed Zero (-0)