Como Converter string em Flutuante ou Int em Python

  1. float() para converter string para float em Python
  2. int() para converter a string para int em Python
  3. ast.literal_eval para converter a string para float ou int em Python
  4. Localização e vírgula na conversão de string para float em Python
  5. 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.

Artigo relacionado - Python String

  • Como verificar se uma string está vazia de uma forma pitónica