Afișarea numărului cu zerouri de început (Programare, Python, Număr Întreg, Formatarea Șirurilor De Caractere)

ashchristopher a intrebat.

Dat:

a = 1
b = 10
c = 100

Cum pot afișa un zero de frunte pentru toate numerele cu mai puțin de două cifre?

Aceasta este ieșirea pe care o aștept:

01
10
100

17 răspunsuri
Jack M.

În Python 2 (și Python 3) puteți face:

print "%02d" % (1,)

Practic, % este ca și cum printf sau sprintf (a se vedea docs).


Pentru Python 3.+, același comportament poate fi obținut și cu format:

print("{:02d}".format(1))

Pentru Python 3.6+, același comportament poate fi obținut cu f-strings:

print(f"{1:02d}")

Comentarii

  • Exemplu: print „%05d” % result[‘postalCode’]] pentru un cod poștal din 5 cifre. –  > Por Nick Woodhams.
  • x = "%02d.txt" % i ridică TypeError (nu poate concatena obiecte ‘str’ și ‘int’), dar x = "%02d.txt" % (i,) nu o face. Interesant. Mă întreb unde este documentat acest lucru –  > Por theta.
  • @theta În 2.7.6, nu primesc o eroare. Poate că a fost o eroare într-o anumită versiune de Python pe care au rezolvat-o între timp? –  > Por Jack M..
  • Poate. În 2.7.6 nu există nicio excepție dacă valoarea formatului nu este un tuple (cel puțin pentru acest exemplu). Dacă mă uit la data comentariului meu, cred că atunci rulam versiunea 2.7.3, iar la acea vreme nu știam că introducerea unei singure variabile într-un tupluplu te pune în siguranță în timp ce folosești % formatorul de șiruri de caractere. –  > Por theta.
  • Pentru a detalia, se poate spune că docs explică acest lucru aici: „În cazul în care nu este dată o aliniere explicită, precedarea câmpului de lățime de un caracter zero („0”) permite o aliniere la zero care ține cont de semn pentru tipurile numerice. Acest lucru este echivalent cu un caracter de umplere „0” cu un tip de aliniere „=”.” –  > Por JHS.
Datageek

Puteți utiliza str.zfill:

print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

amprente:

01
10
100

Comentarii

    77

  • Îmi place această soluție, deoarece ajută nu numai la ieșirea numărului, ci și atunci când trebuie să îl atribuiți unei variabile… de exemplu, x = str(datetime.date.today().month).zfill(2) va returna x ca ’02’ pentru luna februarie.  > Por EroSan.
  • Acesta ar trebui să fie răspunsul corect, deoarece "{1:02d}" nu poate avea variabile în loc de 2 (ca în cazul în care creați o funcție dinamică). –  > Por Joshua.
  • @JoshuaVarghese Poate avea variabile: "{0:0{1}}". Treceți orice număr de zerouri doriți ca al doilea argument. –  > Por Jim.
Ber

În Python 2.6+ și 3.0+, veți utiliza opțiunea format() metoda string:

for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

sau folosind metoda built-in (pentru un singur număr):

print(format(i, '02d'))

A se vedea PEP-3101 pentru noile funcții de formatare.

Comentarii

    29

  • Funcționează și în Python 2.7.5. Puteți utiliza, de asemenea, ‘{:02d}’.format(1) dacă nu doriți să utilizați argumente numite. –  > Por Jason Martens.
  • Funcționează bine în 2.7.2, cu o virgulă mobilă „{0:04.0f}”.format(1.1) dă 0001 (:04 = cel puțin 4 caractere, în acest caz 0-uri de frunte, .0f = virgulă mobilă fără zecimale). Sunt conștient de formatarea %, dar am vrut să modific o instrucțiune .format existentă fără a rescrie întregul nu trebuie să rescriu totul. Vă mulțumim! –  > Por Michael Stimson.
Kresimir
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

amprente:

01
10
100

Comentarii

  • În acest fel puteți repeta argumentul de mai multe ori în interiorul șirului: One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6) –  > Por srodriguex.
  • Compatibil doar cu Python 3. Dacă folosiți Python 2.7, faceți print '{:02}'.format(1) –  > Por Blairg23.
ajd

Sau asta:

print '{0:02d}'.format(1)

Dimitris Fasarakis Hilliard

În Python >= 3.6, , puteți face acest lucru în mod succint cu noile f-strings care au fost introduse folosind:

f'{val:02}'

care tipărește variabila cu numele val cu un fill valoare de 0 și un width din 2.

Pentru exemplul dvs. specific, puteți face acest lucru în mod plăcut într-o buclă:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

care se tipărește:

01 
10
100

Pentru mai multe informații despre șirurile f, aruncați o privire la PEP 498 unde au fost introduse.

nosklo
x = [1, 10, 100]
for i in x:
    print '%02d' % i

are ca rezultat:

01
10
100

Citiți mai multe informații despre formatarea șirurilor de caractere utilizând % în documentație.

Comentarii

  • Exemplul din documentație este nașpa. Ei aruncă cartografierea împreună cu exemplul cu zero de frunte, astfel încât este greu de știut care este care dacă nu știți deja cum funcționează. Asta m-a adus aici, de fapt. –  > Por Grant.
ZuLu

Modul pythonic de a face acest lucru:

str(number).rjust(string_width, fill_char)

În acest fel, șirul original este returnat neschimbat dacă lungimea sa este mai mare decât string_width. Exemplu:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

Rezultate:

01
10
100

WinterChilly

Sau o altă soluție.

"{:0>2}".format(number)

Comentarii

  • Aceasta ar fi metoda Python, deși aș include parametrul pentru claritate – "{0:0>2}".format(number), dacă cineva dorește nLeadingZeros, ar trebui să rețină că poate face și nLeadingZeros:"{0:0>{1}}".format(number, nLeadingZeros + 1) –  > Por Jonathan Allan.
Roberto

Eu procedez astfel:

str(1).zfill(len(str(total)))

Practic, zfill ia numărul de zerouri de început pe care doriți să le adăugați, așa că este ușor să luați cel mai mare număr, să-l transformați într-un șir și să obțineți lungimea, astfel:

Python 3.6.5 (default, May 11 2018, 04:00:52) 
[GCC 8.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> total = 100
>>> print(str(1).zfill(len(str(total))))
001
>>> total = 1000
>>> print(str(1).zfill(len(str(total))))
0001
>>> total = 10000
>>> print(str(1).zfill(len(str(total))))
00001
>>> 

Comentarii

  • Nu contrazice acest lucru răspunsul lui Datageek? –  > Por Peter Mortensen.
Airsource Ltd

Utilizați un șir de format – http://docs.python.org/lib/typesseq-strings.html

De exemplu:

python -c 'print "%(num)02d" % {"num":5}'

Nicolas Gervais

Puteți face acest lucru cu f șiruri de caractere.

import numpy as np

print(f'{np.random.choice([1, 124, 13566]):0>8}')

Aceasta va imprima o lungime constantă de 8, iar restul va fi completat cu un număr de caractere de început. 0.

00000001
00000124
00013566

nvd
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

Linekio

Utilizați:

'00'[len(str(i)):] + str(i)

Sau cu math modul:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)

handle

Toate acestea creează șirul „01”:

>python -m timeit "'{:02d}'.format(1)"
1000000 loops, best of 5: 357 nsec per loop

>python -m timeit "'{0:0{1}d}'.format(1,2)"
500000 loops, best of 5: 607 nsec per loop

>python -m timeit "f'{1:02d}'"
1000000 loops, best of 5: 281 nsec per loop

>python -m timeit "f'{1:0{2}d}'"
500000 loops, best of 5: 423 nsec per loop

>python -m timeit "str(1).zfill(2)"
1000000 loops, best of 5: 271 nsec per loop

>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32

José Antonio Enríquez
df['Col1']=df['Col1'].apply(lambda x: '{0:0>5}'.format(x))

5 este numărul total de cifre.

Am folosit acest link:http://www.datasciencemadesimple.com/add-leading-preceding-zeros-python/

Knowbody

Dacă aveți de-a face cu numere care au fie una, fie două cifre:

'0'+str(number)[-2:] sau '0{0}'.format(number)[-2:]