Como posso verificar se o conteúdo de uma variável é numérico? - página 5

 
Alain Verleyen:
Sinceramente, não tenho idéia da intenção da OP
Se tomarmos como um pedido geral: "Como verificar se o conteúdo de uma variável é numérico?", a solução mais elegante é usar uma expressão regular.
 
Google é seu amigo! Aqui está um link para a implementação do "IsNumeric" em muitos, muitos idiomas incluindo C e C++ (mas sem MQL).

E aqui está outro que parece mais completo (no final da página):

Determine if a string is numeric - Rosetta Code
Determine if a string is numeric - Rosetta Code
  • rosettacode.org
Create a boolean function which takes in a string and tells whether it is a numeric string (floating point and negative numbers included) in the syntax the language uses for numeric literals or numbers converted from strings. The first file is the package interface containing the declaration of the Is_Numeric function. The second file is the...
 
Alain Verleyen:
Sinceramente, não tenho idéia da intenção da OP
. Se tomarmos como um pedido geral: "Como verificar se o conteúdo de uma variável é numérico?", a solução mais elegante é usar uma expressão regular.
Minha intenção é a solicitação geral que você presumiu -- se um número é numérico, então é numérico e pode ser usado para um cálculo razoável sem qualquer forma de erro decorrente da natureza dos números. Apresente um exemplo de código na MQL4 que tem a ver com expressão regular.
 
Sim, o OP está aqui agora e ele ouve e vê todas as soluções e contra soluções que foram ofertadas até agora. Eu aprecio os esforços de todos aqueles que comentaram. Gosto dos códigos de exemplo apresentados pelo honest_knave. Primeiro, ele tem apoiado seus comentários com códigos o tempo todo. Em segundo lugar, ele não codificou com dificuldade nenhum de seus exemplos. Além disso, seus códigos facilmente trataram de qualquer forma de zero (0, 0.0, 0.00, .0, etc.), e são facilmente compreendidos. Eu não acho que o uso de StringToDouble() seja melhor, de qualquer forma.

Graças a todos vocês @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen e Fernando Carreiro.
 
honest_knave:

Portanto:

  • Passe o fio por referência
  • Tirar os espaços em branco
  • Tire o ','
  • Verifique se há apenas um '.
  • Verifique se '+' ou '-' aparece apenas como o primeiro caracter
  • Verifique se todos os outros caracteres são um número entre 0 e 9

por exemplo

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

Se voltar a ser verdade, você pode lançar o cordel como um número.

Mas há mais algumas coisas que precisamos verificar. Embora precisemos verificar que '+' ou '-' aparece como o primeiro personagem, também precisamos verificar se não está sozinho.
 
honest_knave:

Portanto:

  • Passe o fio por referência
  • Tirar os espaços em branco
  • Tire o ','
  • Verifique se há apenas um '.
  • Verifique se '+' ou '-' aparece apenas como o primeiro caracter
  • Verifique se todos os outros caracteres são um número entre 0 e 9

por exemplo

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

Se voltar a ser verdade, você pode lançar o cordel como um número.

Parece que resolvi o problema (sozinho '+' ou '-') adicionando/modificando o código (os códigos nas caixas). Veja a imagem abaixo.