Using Python's Format Specification Mini-Language to align floats
This is what you want:
for i in range(len(job_IDs)):
print "Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}".format(item=job_IDs[i]+':', value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0'), units=memory_units[i])
Here is how it works:
This is the main part: value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0')
, which means: if there is a decimal point, split the string as the whole and decimal part, or set the decimal part to 0.
Then in the format string: {value[0]:>6}.{value[1]:<6}
means, the whole part shifted right, followed by a dot, then the decimal part shifted left.
which prints:
Job 13453: 30.0 MB
Job 123: 150.54 GB
Job 563456: 20.6 MB
Here's another implementation based on .split('.')
idea. It might be more readable. Split on '.'
, right-align the left part, left-align the right part:
width = max(map(len, job_IDs)) # width of "job id" field
for jid, mem, unit in zip(job_IDs, memory_used, memory_units):
print("Job {jid:{width}}: {part[0]:>3}{part[1]:1}{part[2]:<3} {unit:3}".format(
jid=jid, width=width, part=str(mem).partition('.'), unit=unit))
Output
Job 13453 : 30 MB
Job 123 : 150.54 GB
Job 563456: 20.6 MB
In case it helps, here's a similar function I use:
def align_decimal(number, left_pad=7, precision=2):
"""Format a number in a way that will align decimal points."""
outer = '{0:>%i}.{1:<%i}' % (left_pad, precision)
inner = '{:.%if}' % (precision,)
return outer.format(*(inner.format(number).split('.')))
It allows a fixed precision after the decimal point.