Como verificar se uma string é um float em Python

Neste artigo você vai aprender a como verificar se uma string é um float, ou seja, se ela possui um número com casas decimais

verificar se uma string é um float capa

Fala programador(a), beleza? Bora aprender mais sobre Python, strings e floats!

A principal ideia deste artigo é verificar se uma string, por exemplo: “14.12” é de fato um float

E para isso precisaremos criar uma instrução de código onde verificamos se uma string é um número

O método isdigit é capaz disso, porém temos um problema

Pelo fato de ter um ponto no meio da string ele não responde corretamente, então temos que fazer um ajuste no nosso valor

Vamos utilizar replace para tirar todos os pontos ou vírgulas, se for o seu caso

Veja então a solução deste problema:

numero = "12.4"
nao_numero = "asd"

print(numero.replace('.','',1).isdigit()) # True
print(nao_numero.replace('.','',1).isdigit()) # False

No exemplo acima testamos a expressão necessária para verificar a string com dois valores, um float e outro não número

Recebemos um booleano como resposta nas duas sentenças, a que tem um número retorna True e a que não tem False

Então por meio destas respostas vamos guiar o nosso código, podemos inserir a sentença um if, por exemplo

E até em outros casos, caso a utilização seja repetitiva, transformar em uma função pode ser uma boa ideia

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min

Conclusão

Neste artigo você viu como verificar se uma string é um float em Python 3

Utilizamos dois métodos para isso:

  • replace: para remover os pontos ou vírgula da string;
  • isdigit: para verificar se o valor é um número;

Desta maneira conseguimos identificar se um valor é um número decimal ou não

Confira também nosso catálogo de cursos gratuitos, com aulas semanais no YouTube

Onde o replace + isdigit falha:

Antes de sair usando essa solução em tudo, se liga nos casos que ela não cobre

O isdigit só olha pra dígito, então qualquer caractere que não seja número derruba o teste, mesmo quando o valor é um float válido pro Python

Veja:

print("-12.4".replace('.','',1).isdigit())  # False, por causa do sinal de menos
print("12,4".replace('.','',1).isdigit())  # False, aqui o separador é vírgula
print(" 12.4 ".replace('.','',1).isdigit())  # False, tem espaço sobrando
print("12".replace('.','',1).isdigit())  # True, mas isso é um inteiro

Ou seja: número negativo, vírgula como separador decimal e espaço em volta passam batido

E o inteiro entra como verdadeiro também, o que pode ou não ser o que tu quer

Se a tua string vem sempre no mesmo formato (tipo um dado que você mesmo gerou) o replace + isdigit resolve numa linha e tá ótimo

Agora se ela vem de fora (usuário, formulário, arquivo, API), vale usar a abordagem da próxima seção

Jeito mais seguro: try e except com float():

A forma mais confiável de saber se uma string é um float é simplesmente pedir pro Python converter ela e ver se dá ruim

Se converter, é float

Se estourar erro, não é

try:
float("14.12")
print(True)
except ValueError:
print(False)

Parece preguiça, mas é o contrário: quem decide o que é um float válido aqui é o próprio Python, e não uma regrinha que a gente escreveu na mão

Esse jeito já aceita negativo, espaço em volta e notação científica sem tu precisar tratar nada

Tome cuidado com um detalhe: o float() também aceita textos especiais como "nan" e "inf", então se a tua regra de negócio não pode receber isso, filtra antes

E por que ValueError e não um except pelado? Porque except sem tipo engole qualquer erro, inclusive os que você ia querer ver estourando

Já me ferrei uma vez por causa disso 😀

Transformando em uma função reutilizável:

Como eu falei ali em cima, se a verificação se repete no teu código, joga isso numa função e para de copiar e colar

def e_float(valor):
try:
float(valor)
return True
except (ValueError, TypeError):
return False

print(e_float("14.12"))  # True
print(e_float("-3.5"))  # True
print(e_float("asd"))  # False
print(e_float(None))  # False

Repara que entrou o TypeError junto: é ele que aparece quando o valor nem string é (um None, por exemplo)

Agora dá pra usar num if bonitinho:

valor = "14.12"

if e_float(valor):
numero = float(valor)
print(f"É float e vale {numero}")
else:
print("Não é um número decimal")

Massa que a função já devolve o booleano pronto, aí o resto do teu código fica limpo

E quando o número vem com vírgula?

Aqui no Brasil é comum o valor chegar como "14,12" em vez de "14.12"

O Python não entende a vírgula como separador decimal, então a conversão quebra

A saída é normalizar antes de converter:

def e_float_br(valor):
try:
float(str(valor).strip().replace(',', '.'))
return True
except (ValueError, TypeError):
return False

print(e_float_br("14,12"))  # True
print(e_float_br(" 14,12 "))  # True

O strip tira o espaço das pontas e o replace troca a vírgula pelo ponto

Só cuidado se a tua string vier com separador de milhar (tipo "1.234,56"): nesse caso tu precisa tirar o ponto primeiro e só depois trocar a vírgula, senão vira bagunça

Validando o que o usuário digita:

O caso de uso mais comum disso tudo é o input do usuário, que sempre chega como string, mesmo quando a pessoa digita um número

Dá pra prender o programa num laço até vir um valor válido:

while True:
entrada = input("Digite um número decimal: ")

if e_float(entrada):
numero = float(entrada)
break

print("Valor inválido, tenta de novo")

print(f"Número recebido: {numero}")

Repara que a gente valida e converte na sequência, aproveitando o mesmo teste

Esse é o padrão que tu vai repetir em calculadora, formulário de terminal, leitura de CSV e por aí vai

Perguntas frequentes:

O isdigit funciona com float?

Não do jeito que a gente espera: o isdigit devolve verdadeiro só quando todos os caracteres da string são dígitos, e o ponto decimal não é dígito

Por isso a gente remove o ponto com replace antes de chamar ele, ou usa o try/except com float()

Qual a diferença entre isdigit, isnumeric e isdecimal?

Os três olham pra caracteres numéricos, com abrangências diferentes: o isdecimal é o mais restrito, o isdigit aceita alguns caracteres extras como o expoente sobrescrito, e o isnumeric é o mais amplo, aceitando coisas como algarismo romano e fração escrita em caractere único

O que interessa aqui: nenhum dos três aceita ponto ou vírgula, então nenhum deles sozinho valida um decimal

Como saber se uma string é int ou float?

Se ela passa no isdigit puro, é inteiro

Se ela só passa na conversão com float(), tem casa decimal

valor = "14.12"

if valor.isdigit():
print("inteiro")
elif e_float(valor):
print("float")
else:
print("não é número")

E se eu quiser saber o tipo da variável, não da string?

Aí o assunto é outro: usa o isinstance

print(isinstance(14.12, float))  # True
print(isinstance("14.12", float))  # False, é uma string

Repara que a string com número dentro continua sendo string pro Python, beleza?

Leia também

Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

1 Comentário
Oldest
Newest Most Voted
Abneury

Valeu cara!
Foi de grande ajuda

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares