¿Cómo puedo comprobar si el contenido de una variable es numérico? - página 5

 
Alain Verleyen:
Sinceramente, no tengo ni idea de la intención del OP
Si lo tomamos como una petición general: "¿Cómo comprobar si el contenido de una variable es numérico?", la solución más elegante es utilizar una expresión regular.
 
¡Google es tu amigo! Aquí hay un enlace para la implementación de "IsNumeric" en muchos, muchos lenguajes incluyendo C y C++ (pero no MQL sin embargo).

Y aquí hay otro que parece más completo (al final de la 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, no tengo ni idea de la intención del OP
Si lo tomamos como una petición general: "¿Cómo comprobar si el contenido de una variable es numérico?", la solución más elegante es utilizar una expresión regular.
Mi intención es la petición general que has presumido -- si un número es numérico, entonces es numérico y puede ser utilizado para un cálculo razonable sin ninguna forma de error derivado de la naturaleza de los números. Presente un código de ejemplo en MQL4 que tenga que ver con la expresión regular.
 
Sí, el OP está aquí ahora y escucha y ve todas las soluciones y contra-soluciones que se han ofrecido hasta ahora. Agradezco los esfuerzos de todos los que han comentado. Me gustan los códigos de ejemplo presentados por honest_knave. En primer lugar, ha respaldado sus comentarios con códigos todo el tiempo. En segundo lugar, no ha codificado en ninguno de sus ejemplos. Además, sus códigos se ocuparon fácilmente de cualquier forma de cero (0, 0.0, 0.00, .0, etc), y se entienden fácilmente. No creo que el uso de StringToDouble() sea mejor, de todos modos.

Gracias a todos @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen y Fernando Carreiro.
 
honest_knave:

Entonces:

  • Pasar la cadena por referencia
  • Quitar los espacios en blanco
  • Elimina los ','
  • Comprobar que sólo hay un '.'
  • Compruebe que "+" o "-" sólo aparecen como primer carácter
  • Compruebe que todos los demás caracteres sean números entre 0 y 9

Por ejemplo

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);
  }

Si devuelve true, puede convertir la cadena en un número.

Pero hay algunas cosas más que debemos comprobar. Mientras que tenemos que comprobar que '+' o '-' aparece como el primer carácter, también tenemos que comprobar que no está solo.
 
honest_knave:

Entonces:

  • Pasar la cadena por referencia
  • Quitar los espacios en blanco
  • Elimina los ','
  • Compruebe que sólo hay un '.'
  • Compruebe que "+" o "-" sólo aparecen como primer carácter
  • Compruebe que todos los demás caracteres sean números entre 0 y 9

Por ejemplo

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);
  }

Si devuelve true, puede convertir la cadena en un número.

Parece que he resuelto el problema (el '+' o el '-' solos) añadiendo/modificando el código (los códigos de las casillas). Ver la imagen de abajo.