1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por OubeLa, 1 de Outubro de 2008. (Respostas: 4; Visualizações: 4146)

  1. OubeLa

    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: 1 de Outubro de 2008
  2. ixjf

    ixjf Power Member

    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.
     
  3. JoseSimoes

    JoseSimoes Power Member

    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: 1 de Agosto de 2014
  4. fire_rainbow

    fire_rainbow Power Member

    Grande desenterro!
     
  5. ixjf

    ixjf Power Member

    Sim, o tópico tem 6 anos mas achei que era importante mencionar esta alternativa, além disso este tópico está listado em "Repositório de Código".
     

Partilhar esta Página