2013-02-18 17 views
7

Który jest czystą drogę do napisania tej funkcji formatowania:zmienną liczbę cyfr w formacie ciąg

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

>>> percent(0.1565) 
'16%' 

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

problem jest formatowanie numeru z danej liczby cyfr, nie lubię używać zarówno " % "operator i metoda formatowania.

+2

Po prostu nie podoba? Wygląda dobrze dla mnie? – Aesthete

+3

@Aesthete: Nie. Nie podoba mi się to. –

Odpowiedz

20

Lubię to jedno:

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

Test:

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

+1 Ja też to lubię – Volatility

+0

+1 - Jak to opisano? szukanie krótko @ [format-spec] (http://docs.python.org/2/library/string.html#formatspec) Nie widzę, aby można było zagnieżdżać formaty plików, ale bez wątpienia działa. – sotapme

+3

@sotapme - wyszukaj słowo "zagnieżdżone" na swojej stronie, do której prowadzi link. – eumiro

2

* does what you want, dla formatowania ciągów w stylu printf.

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

Zaawansowane formatowanie string (zdefiniowane w PEP 3101 i udokumentowane w 7.1.3. Format String Syntax) nie wydaje się być w stanie zrobić to w jednym przejściu. (Patrz 7.1.3.1. Format Specification Mini-Language: precision jest integer tylko).

+0

Cóż, jest w stanie zrobić to za jednym razem. Zobacz moją odpowiedź. – eumiro

+0

precyzja oznacza liczbę cyfr. oczywiście _it_ jest liczbą całkowitą, ale może być _applied_ na pływające –

+0

@gnibbler: Miałem na myśli gramatykę: 'precyzja :: = liczba całkowita' –

1

Z docs:

Minimalna szerokość pola (opcjonalnie). Jeśli zostanie określony jako "*" (gwiazdka), rzeczywistą szerokość odczytu odczyta się z kolejnego elementu krotki w wartościach i obiekt, który ma zostać przekonwertowany, występuje po minimalnej szerokości pola i opcjonalnej dokładności .

Przykład:

def percent(value, digits=0): 
    print '%.*f%%' % (digits, value*100) 
>>> percent(0.1565, 2) 
15.65% 
Powiązane problemy