Jak sformatować liczbę zmiennoprzecinkową do stałej szerokości w Pythonie


322

Jak sformatować liczbę zmiennoprzecinkową na stałej szerokości, spełniając następujące wymagania:

  1. Początkowe zero, jeśli n <1
  2. Dodaj końcowe zera dziesiętne, aby wypełnić stałą szerokość
  3. Obcinaj cyfry dziesiętne poza ustaloną szerokość
  4. Wyrównaj wszystkie przecinki dziesiętne

Na przykład:

% formatter something like '{:06}'
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print formatter.format(number)

Wyjście byłoby jak

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

Odpowiedzi:


500
for x in numbers:
    print "{:10.4f}".format(x)

odciski

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

Specyfikator formatu w nawiasach klamrowych jest zgodny ze składnią łańcucha formatu Python . W szczególności w tym przypadku składa się z następujących części:

  • Pusty ciąg przed środkami okrężnicy „wziąć następny dostarczone argument format()” - w tym przypadku w xjako jedyny argument.
  • 10.4fCzęść po okrężnicy jest specyfikację formatu .
  • W foznacza notacji dziesiętnej.
  • 10Jest całkowita szerokość pola drukowanego lefted wyściełane przestrzeniami.
  • Jest 4to liczba cyfr po przecinku.

12
Rozumiem więc, że 4f oznacza ograniczenie miejsc dziesiętnych do 4 (z zerami na końcu), ale co oznacza 10? Czy to oznacza, że ​​to formatowanie nie będzie działać z liczbami całkowitymi większymi niż 9999999999 (dziesięć 9)? Po prostu ciekawy.
hobbes3

55
10.4oznacza szerokość 10 znaków i dokładność 4 miejsc po przecinku.
MRAB

13
@ hobbes3: 10minimalna szerokość pola, tj. minimalna długość drukowanego ciągu. Liczby są domyślnie wyrównane do prawej i wypełnione spacjami - więcej informacji można znaleźć w dokumentacji .
Sven Marnach,

9
W przypadku ("%0.4f" % x).rjust(10)
pytonów starszych

22
@StevenRumbalski: Lub po prostu "%10.4f" % x. W Pythonie 2.6 możesz także użyć "{0:10.4f}".format(x).
Sven Marnach

88

Minęło kilka lat, odkąd udzielono na nie odpowiedzi, ale od wersji Python 3.6 ( PEP498 ) można było używać nowego f-strings:

numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print(f'{number:9.4f}')

Wydruki:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

2
Pamiętaj, że szerokość obejmuje również znak kropki. Jeśli więc określisz 9 jako szerokość, 1 będzie użyte do wydrukowania kropki, a pozostałe 8 będzie do drukowania cyfr i spacji.
off99555

37

W python3 działa:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4

Zmieniło się to w ciągu ostatnich 4 lat, teraz %formatowanie jest najstarszą metodą formatowania. Z kilku powodów preferowane jest użycie str.formatlub . Wcześniej, kiedy było tylko , ludzie mieli pewne powody, ale naprawili tę dziurę. formatuj mini-dokumenty , przykłady str.format z dokumentów i przykłady literałów f-string w dokumentachf-strings%str.formatf-strings
ninMonkey


6

Możesz także zostawić pad z zerami. Na przykład, jeśli chcesz numbermieć 9 znaków długości, po lewej stronie wypełnij zerami:

print('{:09.3f}'.format(number))

Zatem jeśli number = 4.656wynikiem jest:00004.656

W twoim przykładzie wynik będzie wyglądał następująco:

numbers  = [23.2300, 0.1233, 1.0000, 4.2230, 9887.2000]
for x in numbers: 
    print('{:010.4f}'.format(x))

drukuje:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Jednym z przykładów, w których może to być przydatne, jest poprawne wyświetlanie nazw plików w kolejności alfabetycznej. Zauważyłem w niektórych systemach Linux, liczba to: 1,10,11, .. 2,20,21, ...

Dlatego jeśli chcesz wymusić niezbędną kolejność numeryczną w nazwach plików, musisz zostawić pad z odpowiednią liczbą zer.


2

W Python 3.

GPA = 2.5
print(" %6.1f " % GPA)

6.1foznacza, że ​​po kropkach 1 cyfra pokazuje, jeśli drukujesz 2 cyfry po kropkach, powinieneś tylko %6.2ftak, aby %6.3f3 cyfry były drukowane po kropce.


0

Potrzebowałem czegoś podobnego do tablic. To mi pomogło

some_array_rounded=np.around(some_array, 5)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.