2012-05-08 14 views
10

Ho bisogno di fare qualche formattazione decimale in python. Preferibilmente, il valore in virgola mobile dovrebbe sempre mostrare almeno uno zero iniziale e una posizione decimale. Esempio:Formatta un float in Python con un numero massimo di posizioni decimali e senza riempimento dello zero aggiuntivo

Input: 0 
Output: 0.0 

I valori con più cifre decimali devono continuare a mostrarli, finché non si ottiene 4 punti. Quindi:

Input: 65.53 
Output: 65.53 

Input: 40.355435 
Output: 40.3554 

So che posso usare {} 0.4f per farlo stampare a quattro cifre decimali, ma sarà pad con 0s indesiderati. Esiste un codice di formattazione che indica di stampare fino a un certo numero di decimali, ma di lasciarli vuoti se non ci sono dati? Credo che C# realizzi questo con qualcosa come:

floatValue.ToString("0.0###") 

Dove i simboli # rappresentano un luogo che può essere lasciato vuoto.

+0

Questo mi dà invidia C#. –

risposta

14

cosa si sta chiedendo dovrebbe essere indirizzata dai metodi di arrotondamento come la funzione round e lasciare che il il numero float viene visualizzato in modo naturale con la sua rappresentazione di stringa.

>>> round(65.53, 4) 
'65.53' 
>>> round(40.355435, 4) 
'40.3554' 
>>> round(0, 4) 
'0.0' 
+0

..... Sì. Sì, sarebbe così. Stavo cercando la formattazione perché è così che il codice originale l'ha realizzata, ma questo è quello che voglio. Immagino che potresti chiamarlo una scoreggia cerebrale. – KChaloux

2

Siamo spiacenti, il meglio che posso fare:

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

corresse:

ff=1./2. 
' {:0.4f}'.format(ff).rstrip('0')+'0'[0:(ff%1==0)] 
+0

Sei quasi tutto lì. Il suo esempio in C# avrebbe formato '1' come' '1.0'' e il tuo sarebbe stato formattato come '' 1.''. –

+0

float ('{: 0.4f}'. Format (x) .rstrip ('0')) questo dovrebbe occuparsi del problema anche con i passaggi. >>> float ('{: 0.4f}'. Format (1) .rstrip ('0')) 1.0 – tapan

+0

@tapan: restituisce un valore float, non una stringa. –

0
>>> 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' 
+0

Sei quasi arrivato. Il suo esempio in C# avrebbe formattato '1.0' come' '1.0'' e il tuo sarebbe stato formattato come '' 1.''. –

+0

Ho risolto la soluzione interessante 1.0 – User

+0

. Funziona per numeri interi, ma cercando di passare in un valore di say, 2.5 sembra sempre restituire 'None'. Mi giro un po 'di più. Speravo che ci fosse qualcosa incorporato nella funzione di formattazione per gestire questo. – KChaloux

Problemi correlati