2013-02-18 20 views
7

che è un modo pulito per scrivere questa funzione di formattazione:numero variabile di cifre in stringa di formato

def percent(value,digits=0): 
    return ('{0:.%d%%}' % digits).format(value) 

>>> percent(0.1565) 
'16%' 

>>> percent(0.1565,2) 
'15.65%' 

il problema è la formattazione di un numero con un certo numero di cifre, non mi piace usare sia ' % 'operatore e metodo di formattazione.

+2

Basta non piace? Mi va bene? – Aesthete

+3

@ Estete: No. Non mi piace. –

risposta

20

ho come questo:

'{0:.{1}%}'.format(value, digits) 

prova:

>> '{0:.{1}%}'.format(0.1565, 0) 
'16%' 
>> '{0:.{1}%}'.format(0.1565, 2) 
'15.65%' 
+0

+1 Mi piace anche a me – Volatility

+0

+1 - Come è descritto? cercando brevemente @ [format-spec] (http://docs.python.org/2/library/string.html#formatspec) Non vedo che sia valido avere formati nidificati eppure funziona indubbiamente. – sotapme

+3

@sotapme - cerca la parola "annidato" nella tua pagina collegata. – eumiro

2

* does what you want, per la formattazione della stringa in stile printf.

>>> def percent(value, digits=0): 
...  return '%.*f%%' % (digits, value * 100) 
... 
>>> percent(0.1565, 2) 
'15.65%' 

avanzata formattazione di stringhe (definito in PEP 3101 e documentato in 7.1.3. Format String Syntax) non sembra essere in grado di fare questo in un solo passaggio. (Vedere 7.1.3.1. Format Specification Mini-Language: precision è integer solo.)

+0

Bene, è in grado di farlo in un solo passaggio. Vedi la mia risposta. La precisione – eumiro

+0

si riferisce al numero di cifre. ovviamente _it_ è un numero intero, ma può essere _applied_ per float –

+0

@gnibbler: Mi riferivo alla grammatica: 'precision :: = intero' –

1

Dal docs:

larghezza minima di campo (opzionale). Se specificato come '*' (asterisco), la larghezza effettiva viene letta dall'elemento successivo della tupla nei valori e l'oggetto da convertire viene dopo la larghezza minima del campo e la precisione opzionale .

Esempio:

def percent(value, digits=0): 
    print '%.*f%%' % (digits, value*100) 
>>> percent(0.1565, 2) 
15.65% 
Problemi correlati