Formatting Complex Numbers Formatting Complex Numbers python python

Formatting Complex Numbers


You could do it as is shown below using the str.format() method:

>>> n = 3.4+2.3j>>> n(3.4+2.3j)>>> '({0.real:.2f} + {0.imag:.2f}i)'.format(n)'(3.40 + 2.30i)'>>> '({c.real:.2f} + {c.imag:.2f}i)'.format(c=n)'(3.40 + 2.30i)'

To make it handle both positive and negative imaginary portions properly, you would need a (even more) complicated formatting operation:

>>> n = 3.4-2.3j>>> n(3.4-2.3j)>>> '({0:.2f} {1} {2:.2f}i)'.format(n.real, '+-'[n.imag < 0], abs(n.imag))'(3.40 - 2.30i)'

Update - Easier Way

Although you cannot use f as a presentation type for complex numbers using the string formatting operator %:

n1 = 3.4+2.3jn2 = 3.4-2.3jtry:    print('test: %.2f' % n1)except Exception as exc:    print('{}: {}'.format(type(exc).__name__, exc))

Output:

TypeError: float argument required, not complex

You can however use it with complex numbers via the str.format() method. This isn't explicitly documented, but is implied by the Format Specification Mini-Language documentation which just says:

'f'  Fixed point. Displays the number as a fixed-point number. The default precision is 6.

. . .so it's easy to overlook.In concrete terms, the following works in both Python 2.7.14 and 3.4.6:

print('n1: {:.2f}'.format(n1))print('n2: {:.2f}'.format(n2))

Output:

n1: 3.10+4.20jn2: 3.10-4.20j

This doesn't give you quite the control the code in my original answer does, but it's certainly much more concise (and handles both positive and negative imaginary parts automatically).

Update 2 - f-strings

Formatted string literals (aka f-strings) were added in Python 3.6, which means it could also be done like this in that version or later:

print(f'n1: {n1:.2f}')  # -> n1: 3.40+2.30jprint(f'n2: {n2:.3f}')  # -> n2: 3.400-2.300j

In Python 3.8.0, support for an = specifier was added to f-strings, allowing you to write:

print(f'{n1=:.2f}')  # -> n1=3.40+2.30jprint(f'{n2=:.3f}')  # -> n2=3.400-2.300j


For questions like this, the Python documentation should be your first stop. Specifically, have a look at the section on string formatting. It lists all the string format codes; there isn't one for complex numbers.

What you can do is format the real and imaginary parts of the number separately, using x.real and x.imag, and print it out in a + bi form.


Neither String Formatting Operations - i.e. the modulo (%) operator) -nor the newer str.format() Format String Syntax support complex types.However it is possible to call the __format__ method of all built in numeric types directly.Here is an example:

>>> i = -3 # int>>> l = -33L # long (only Python 2.X)>>> f = -10./3 # float>>> c = - 1./9 - 2.j/9 # complex>>> [ x.__format__('.3f') for x in (i, l, f, c)]['-3.000', '-33.000', '-3.333', '-0.111-0.222j']

Note, that this works well with negative imaginary parts too.