Como Converter string em Flutuante ou Int em Python
-
float()
para converter string para float em Python -
int()
para converter a string para int em Python -
ast.literal_eval
para converter a string para float ou int em Python - Localização e vírgula na conversão de string para float em Python
- Comparação de performances de diferentes métodos para converter string para float ou int em Python
Este artigo tutorial irá introduzir como converter string para float ou int em Python.
float()
para converter string para float em Python
float()
converte a string para o número apontador float
, se possível.
>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0
int()
para converter a string para int em Python
int()
poderia converter a string para um número inteiro se a string dada for a representação de um número inteiro. Caso contrário, ele irá aumentar o 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'
Você poderia converter a string para float
primeiro e então lançá-la para int
se a string dada for a representação de um número de ponto flutuante.
>>> int(float('111.0'))
111
ast.literal_eval
para converter a string para float ou int em Python
ast.literal_eval(string)
avalia com segurança a string dada contendo uma expressão Python. Ele poderia converter a string para float
ou int
automaticamente.
>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111
Localização e vírgula na conversão de string para float em Python
Se a vírgula ,
existe na representação de string, então a conversão float
irá lançar uma exceção ValueError
. Mas as vírgulas são regualry utilizadas como mil seperator em países como EUA ou Reino Unido, por exemplo 111,111.22
, ou marca decimal na maioria dos países europeus, por exemplo 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'
O módulo locale
deve ser utilizado para atribuir a informação do locale e então a função locale.atof()
poderia analisar a string dada como um flutuador de acordo com as configurações do locale.
Vírgula como mil seperator em US ou UK
>>> 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
A vírgula ,
pode ser interpretada corretamente se for dada a configuração correta do local.
Esteja ciente também que o resultado da conversão é sempre do tipo float
mesmo que a representação da string dada seja um inteiro.
Vírgula como marca demica em países europeus
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222
O 111,222
é convertido apropriadamente para 111.222
, e 111.111,222
também poderia ser convertido apropriadamente para 111111.222
, pois o ponto .
é utilizado como o mil separador em países europeus como a Holanda.
Comparação de performances de diferentes métodos para converter string para float ou int em Python
Utilizamos o timeit
para verificar o desempenho da eficiência entre diferentes métodos.
>>> 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
O método ast.literal_eval()
é tremendamente mais lento que o método float
, como mostrado acima. Não deve ser a primeira escolha se você simplesmente precisa converter string para float ou int em Python. O método ast.literal_eval()
é super-engenharia nesta aplicação, pois seu alvo principal deve ser avaliar a string contendo a expressão Python.
O locale.atof()
também é extremamente lento, portanto só deve ser utilizado quando existem vírgulas na string para a convenção nos EUA ou Reino Unido, ou o ponto .
significa o separador de milhares, mas a vírgula ,
significa a marca decimal nos países europeus. Em outras palavras, você deve utilizar locale.atof()
se isso for realmente necessário.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook