How to format a float with a maximum number of decimal places and without extra zero padding?

Question:

I need to do some decimal place formatting in python. Preferably, the floating point value should always show at least a starting 0 and one decimal place. Example:

Input: 0
Output: 0.0

Values with more decimal places should continue to show them, until it gets 4 out. So:

Input: 65.53
Output: 65.53

Input: 40.355435
Output: 40.3554

I know that I can use {0.4f} to get it to print out to four decimal places, but it will pad with unwanted 0s. Is there a formatting code to tell it to print out up to a certain number of decimals, but to leave them blank if there is no data? I believe C# accomplishes this with something like:

floatValue.ToString("0.0###")

Where the # symbols represent a place that can be left blank.

Asked By: KChaloux

||

Answers:

Sorry, the best I can do:

' {:0.4f}'.format(1./2.).rstrip('0')

Corrected:

ff=1./2.
' {:0.4f}'.format(ff).rstrip('0')+'0'[0:(ff%1==0)]
Answered By: f p
>>> def pad(float, front = 0, end = 4):
    s = '%%%s.%sf' % (front, end) % float
    i = len(s)
    while i > 0 and s[i - 1] == '0':
        i-= 1
    if s[i - 1] == '.' and len(s) > i:
        i+= 1 # for 0.0
    return s[:i] + ' ' * (len(s) - i)

>>> pad(0, 3, 4)
'0.0   '
>>> pad(65.53, 3, 4)
'65.53  '
>>> pad(40.355435, 3, 4)
'40.3554'
Answered By: User

What you’re asking for should be addressed by rounding methods like the built-in round function. Then let the float number be naturally displayed with its string representation.

>>> round(65.53, 4)  # num decimal <= precision, do nothing
'65.53'
>>> round(40.355435, 4)  # num decimal > precision, round
'40.3554'
>>> round(0, 4)  # note: converts int to float
'0.0'
Answered By: Zeugma

From trial and error I think :.15g is what you want:

In: f"{3/4:.15g}"
Out: '0.75'

In f"{355/113:.15g}"
Out: '3.14159292035398'

(while f"{3/4:.15f}" == '0.750000000000000')

Answered By: rodrigob