Mai mult
Cum pot analiza un șir de caractere la un float sau int?
În Python, cum pot analiza numerică șir de ca"545.2222"sa corespunzătoare float valoare,
545.2222? Sau parse string
"31" la un număr întreg, 31
?
Vreau doar să știu cum de a analiza o float str
la un "float", și (separat) o int str
la o int
.
2097
23
Python metodă de a verifica dacă un șir este un float:
O mai fi si nume mult mai potrivit pentru această funcție ar putea fi:
is_convertible_to_float(valoare)
Ceea ce este, și nu este un float în Python ar putea să vă surprindă:
Crezi că știi ce numere sunt? Nu sunt atât de bun pe cât crezi! Nu mare surpriză.
Don't de a folosi acest cod pe viață software-ul esențial!
Prinderea largă excepții de acest fel, uciderea canari si inghitit excepția creează o mică șansă ca un valabile plutesc ca string va returna false. Anii
float(...)
linie de cod poate nu a reușit pentru oricare din o mie de motive care nu au nimic de-a face cu conținutul șirului. Dar dacă te're scris viața software-ul esențial într-o rață-tastarea prototip de limbă, cum ar fi Python, atunci'am probleme mai mari.Aceasta este o altă metodă care merită să fie menționate aici, ast.literal_eval:
Asta este, o sigur 'eval'
Localizare și virgule
Tu ar trebui să ia în considerare posibilitatea de virgule în șir de reprezentare a unui număr, pentru cazuri ca
float("545,545.2222")
care aruncă o excepție. În schimb, utilizați metode în "locale" pentru a converti șiruri de numere și de a interpreta corect virgule. Aniilocale.atof
metoda convertește la un flotor într-un singur pas odata locale a fost stabilit pentru numărul dorit de convenții.Exemplu 1 -- Statele Unite ale americii numărul convențiilor
În Statele Unite ale americii și marea BRITANIE, virgule poate fi folosit ca un separator de mii. În acest exemplu, cu American locale, virgula este manipulat în mod corespunzător ca un separator:
Exemplu 2-European număr de convenții
În majoritatea țărilor lumii, virgulele sunt folosite pentru semnele zecimale în loc de perioade. În acest exemplu, cu locale francez, virgula este corect tratată ca o marca zecimală:
Metoda
locale.atoi
este, de asemenea, disponibile, dar argumentul ar trebui să fie un număr întreg.Dacă nu't de potrivnic module terțe părți, ai putea verifica fastnumbers modulul. Acesta oferă o funcție numită fast_real, care face exact ceea ce această întrebare este de a cere și nu-l mai repede decât o pură implementare Python:
Utilizatori codelogic și harley sunt corecte, dar păstrează în minte, dacă știi șir este un număr întreg (de exemplu, 545) puteți apela int("545"), fără prima de turnare să plutească.
Dacă siruri de caractere sunt într-o listă, puteți folosi funcția hartă la fel de bine.
Este bună doar dacă au're toate de același tip.
Întrebarea pare un pic mai vechi. Dar permiteți-mi să sugerez o funcție, parseStr, care face ceva similar, care este, se întoarce întreg sau float și dacă un anumit șir ASCII nu poate fi convertit la nici unul dintre ei se întoarce neatinsă. Codul de curs ar putea fi ajustate pentru a face doar ceea ce vrei:
L's bine că vă cere să o facă separat. Daca're amestecarea lor, poate fi setarea-te pentru probleme mai târziu. Răspunsul simplu este:
`"545.2222" să float:
`"31" la un număr întreg:
Alte conversii, int la și de la siruri de caractere și literali:
Conversii din diverse baze, și ar trebui să știi de bază în avans (10 este implicit). Notă puteți prefix-le cu ce Python se așteaptă pentru literali (vezi mai jos) sau elimina prefixul:
Dacă tu nu't știu bază în avans, dar nu știi că va avea prefixul corect, Python poate deduce acest lucru pentru tine dacă treci de la " 0 " ca bază:
Non-Zecimal (de exemplu Integer) Literali din alte Baze
Dacă motivația ta este de a avea propriul cod în mod clar reprezintă hard-coded valori specifice, cu toate acestea, este posibil să nu nevoie pentru a converti de la baze - puteți să Python face pentru tine în mod automat cu sintaxa corectă.
Puteți utiliza apropos prefixe pentru a obține conversia automată a numerelor întregi cu următoarele literali. Acestea sunt valabile si pentru Python 2 și 3:
Binar, prefix
0b
Octal, prefixul
0
Hexazecimal, prefix
0x
Acest lucru poate fi util atunci când descrie binar steaguri, permisiunile de fișiere în cod, sau valori hex pentru culori - de exemplu, nota nr citate:
Face ambiguă Python 2 octals compatibil cu Python 3
Dacă vedeți un număr întreg care începe cu 0, în Python 2, aceasta este (învechită) octal sintaxă.
Este rău pentru că se pare că valoarea ar trebui să fie
37
. Deci, în Python 3, acum se ridică oSyntaxError
:Convert Python 2 octals să octals, care funcționează în ambele 2 și 3 cu
0o
prefix:float("545.2222") " și " int(float("545.2222"))
De YAML parser poate ajuta să îți dai seama ce tip de date string este. Folosesc yaml.load()
, și apoi puteți folosi
tip(rezultat) la testul de tip:Eu folosesc această funcție pentru că
Acesta va converti șirul tip
def num(s): """num(s) num(3),num(3.7)-->3 num('3')-->3, num('3.7')-->3.7 num('3,700')-->ValueError num('3a'),num('a3'),-->ValueError num('3e4') --> 30000.0 """ încercați: return int(s) cu excepția ValueError: încercați: reveni float(s) cu excepția ValueError: raise ValueError('argument nu este un șir de numărul de')
Ai nevoie să ia în considerare rotunjirea pentru a face acest lucru în mod corespunzător.
I. e. int(5.1) => 5 int(5.6) => 5 -- greșit, ar trebui să fie de 6, deci avem de a face int(5.6 + 0.5) => 6
Pentru a distribui în python utilizați constructorul funtions de tip, trece în șir (sau orice valoare sunteți încercarea de a arunca) ca un parametru.
De exemplu:
În spatele scenei, python este de asteptare obiectelorfloat
metoda, care ar trebui să se întoarcă un flotor de reprezentare a parametrului. Acest lucru este deosebit de puternic, după cum puteți defini propriile tipuri (folosind clase) cu o
float` metodă, astfel încât acesta poate fi turnat într-un flotor folosind float(myobject).Sunt surprins că nimeni nu a menționat regex pentru că, uneori, string trebuie să fie pregătite și normalizat înainte de turnare să număr
utilizare:
și apropo, ceva pentru a verifica dacă aveți un număr:
Aceasta este o versiune corectată de https://stackoverflow.com/a/33017514/5973334
Acest lucru va încerca să elimine un șir de caractere și de a reveni fie
int
sau "float" în funcție de ceea ce șir reprezintă. S-ar putea ridica parsarea excepții sau au un comportament neașteptat.Utilizare:
Acesta este cel mai Pythonic fel am putea veni cu.