Come convertire una stringa in Float o Int in Python

  1. float() per convertire la stringa in float in Python
  2. int() per convertire la stringa in int in Python
  3. ast.literal_eval per convertire la stringa in float o int in Python
  4. Localizzazione e virgole nella conversione della stringa in float in Python
  5. Confronto delle prestazioni di diversi metodi per convertire la stringa in float o int in Python

Questo articolo del tutorial introdurrà come convertire una stringa in float o int in Python.

float() per convertire la stringa in float in Python

float() converte la stringa nel numero di puntamento float, se possibile.

>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0

int() per convertire la stringa in int in Python

int() potrebbe convertire la stringa in un intero se la stringa data è la rappresentazione di un intero. Altrimenti solleverà ValueError.

>>> int('111')
111
>>> int('111.0')
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    int('111.0')
ValueError: invalid literal for int() with base 10: '111.0'
>>> int('111.22222')
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    int('111.22222')
ValueError: invalid literal for int() with base 10: '111.22222'

Si potrebbe convertire la stringa in float prima e poi lanciarla in int se la stringa data è la rappresentazione di un numero a virgola mobile.

>>> int(float('111.0'))
111

ast.literal_eval per convertire la stringa in float o int in Python

ast.literal_eval(string) valuta in modo sicuro la stringa data contenente un’espressione Python. Potrebbe convertire la stringa in float o int automaticamente.

>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111

Localizzazione e virgole nella conversione della stringa in float in Python

Se la virgola , esiste nella rappresentazione delle stringhe, allora la conversione float lancerà un’eccezione ValueError. Ma le virgole sono regolarmente usate come mille separatori in paesi come gli Stati Uniti o il Regno Unito, per esempio 111,111.22, o come segno decimale nella maggior parte dei paesi europei, per esempio 111,222.

>>> float('111,111.22')
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    float('111,111.22')
ValueError: could not convert string to float: '111,111.22'
>>> float('111,111')
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    float('111,111')
ValueError: could not convert string to float: '111,111'

Il modulo locale dovrebbe essere usato per assegnare le informazioni locali e poi la funzione locale.atof() potrebbe analizzare la stringa data come un galleggiante secondo le impostazioni locali.

Le virgole come mille separatori negli USA o nel Regno Unito

>>> import locale
>>> A = '111,111.222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(A)
111111.222
>>> locale.atof('111,111')
111111.0

La virgola , potrebbe essere interpretata correttamente se viene data la giusta impostazione del locale.

Siate anche consapevoli del fatto che il risultato della conversione è sempre di tipo float anche se la rappresentazione della stringa data è un numero intero.

Le virgole come segno demico nei paesi europei

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222

111.222 è convertito correttamente in 111.222, e 111.111.222 potrebbe anche essere convertito correttamente in 11111111.222 in quanto il punto . è usato come il mille separatore in paesi europei come i Paesi Bassi.

Confronto delle prestazioni di diversi metodi per convertire la stringa in float o int in Python

Utilizziamo il timeit per verificare le prestazioni di efficienza tra i diversi metodi.

>>> import timeint
>>> timeit.timeit('float(111.2222)', number=1000000)
0.14707240000007005
>>> timeit.timeit('ast.literal_eval("111.2222")', setup='import ast', number=1000000)
4.779956100000163
>>> timeit.timeit('locale.atof("111.2222")', setup='import locale; locale.setlocale(locale.LC_ALL, "en_US.UTF-8")', number=1000000)
6.092166299999917

Il metodo ast.literal_eval() è tremendamente più lento del metodo float come mostrato sopra. Non dovrebbe essere la prima scelta se si ha semplicemente bisogno di convertire una stringa in float o int in Python. ast.literal_eval() è eccessivamente ingegnerizzato in questa applicazione, in quanto il suo obiettivo principale dovrebbe essere la valutazione della stringa contenente l’espressione Python.

locale.atof() è anche estremamente lento, quindi dovrebbe essere usato solo quando esistono virgole nella stringa per la convenzione negli USA o nel Regno Unito, o punto . significa il mille separatore ma virgola , significa il segno decimale nei paesi europei. In altre parole, si dovrebbe usare locale.atof() se è veramente necessario.

Articolo correlato - Python String

  • Verifica che una stringa contenga un numero in Python
  • Stringa suddivisa in base a più delimitatori in Python