C++ - Função que verifica se uma string é um número válido

OubeLa

Power Member
Código:
#include <string>
#include <algorithm>

//verifica se uma string é um número inteiro/decimal válido passível de ser convertido para int, float ou double
bool valid(string st)
{
    bool valid = false;
    string numero = "0123456789.";

    if ((st[0] == '+' || st[0] == '-') && st.size() > 1)
        st = st.substr(1);

    if (count(st.begin(), st.end(), '.') <= 1 && st.find_first_not_of(numero) > st.size())
        valid = true;

    if (st[0] == '.' && st.size() == 1)
        valid = false;

    return valid;
}
 
Última edição:
Com o C++11, podes usar as funções std::stoi/stod/stof para converter uma string para int, double e float, respetivamente. As três funções "throwam" (isto de falar de programação em português não dá :() a exceção "std::invalid_argument" se a conversão não for possível.
 
A resposta do ixjf é a correcta. (já agora sempre usei o termo atirar (como em atirar ao ar) - e apanhar, nas minhas aulas, dando simultâneamente a "tradução" para inglês).

No entanto nem procedendo assim se tem a garantia de estar a fazer a coisa bem, porque, por exemplo, a conversão da string "1.23456789012345678901234567890123456789012345679012345678901234567890" - sem espaços pelo meio - para float é válida e até está dentro do alcance (range), portanto não há erro, nenhuma excepção é atirada (throw), mas a conversão, ao ser feito, introduz silenciosamente um erro de arredondamento (round, aka round-up), o que pode ser relevante ou não. Tem de se estar preparado para estas questões.

O problema do programa do sir_atmc é que na verdade não é fácil saber o que se pode considerar, por exemplo, um int. Isso depende do compilador e/ou da máquina, se bem que recentemente a coisa seja razoavelmente estável.

Dito isto, se for um trabalho para um cadeira, provavelmente o processo sir_atmc é o indicado :-).

Raciocínio: Por exemplo 2 000 000 000 (base 10) é um int? (nuns casos sim, noutros não). É um float válido? provavelmente sim, mas não pode exactamente representado nessa forma.
 
Última edição:
Back
Topo