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

 

MathIsValidNumber() acepta un doble. Por favor, compruebe la documentación.

Le estás dando una cadena.

Si no siguieras ignorando mis comentarios sobre el uso de #property strict verías que el compilador te advierte de esto.

Si tomas una cadena de letras y la conviertes en un doble, el valor del doble se convierte en 0.

0 es un número válido.

De ahí que tu código devuelva true.

 
honest_knave:

MathIsValidNumber() acepta un doble. Por favor, compruebe la documentación.

Le estás dando una cadena.

Si no siguieras ignorando mis comentarios sobre el uso de #property strict verías que el compilador te advierte sobre esto.

Si tomas una cadena de letras y la conviertes en un doble, el valor del doble se convierte en 0.

0 es un número válido.

De ahí que tu código devuelva true.

Pero no me has dicho en tu respuesta que MathIsValidNumber() sólo compara dobles, y no cadenas. Por cierto, ¿qué número no es un número válido? Excepto los números complejos o los infinitos, y quién quiere usarlos en MQL4 por cierto. De todos modos, la "palabra clave" parece engañosa.
 
macpee:
Pero no me has dicho en tu respuesta que MathIsValidNumber() sólo compara dobles, y no cadenas. Por cierto, ¿qué número no es un número válido? Excepto los números complejos o los infinitos, y quién quiere usarlos en MQL4 por cierto. De todos modos, la "palabra clave" parece engañosa.
Así que ahora pregunto de nuevo, ¿cuál es el comando para decirle al compilador para decidir si una variable contiene una cadena y no cualquier forma de número? Gracias por su respuesta anticipada. En visual basic, recuerdo una palabra clave como "Isnumeric".
 
macpee:
Pero no me has dicho en tu respuesta que MathIsValidNumber() sólo compara dobles, y no cadenas.

Supuse que te habrías molestado en revisar la documentación...

Y si no hubieras seguido ignorando mis consejos sobre la #propiedadestricta...

macpee:
Así que ahora vuelvo a preguntar, ¿cuál es el comando para decirle al compilador que decida si una variable contiene una cadena y no cualquier forma de número? Gracias por tu respuesta anticipada.

Si no esperas que el valor sea nunca 0, haz un type-cast de la cadena a un double y comprueba que no es igual a 0.

 
honest_knave:

Supuse que te habrías molestado en revisar la documentación...

Y si no seguiste ignorando mi consejo sobre #property strict...

Si no esperas que el valor sea nunca 0, haz un type-cast de la cadena a un double y comprueba que no es igual a 0.

Buena respuesta. Ahora puedo probarlo. Pero qué pasa con el número cero. Supongo que es un valor doble, así como un valor entero. Cuando lanzas una cadena de caracteres devuelve 0, cuando introduces 0, devuelve 0. ¿Entonces...?
 
macpee:
Pero qué pasa con el número cero. Supongo que es un valor doble, así como un valor entero. Cuando lanzas la cadena devuelve 0, cuando introduces 0, devuelve 0. Entonces...

Sí, eso es un problema.

Podrías hacer una comparación de cadenas si el valor de fundición = 0

es decir, if(cast_value == 0 && str_value == "0")

Pero tendrías que pensar en que se introduzca 0.0 o 0.00.

Podrías reventar la cadena en un array de caracteres y probar cada carácter.

Depende de lo importante que sea esto.

 
void OnStart()
  {
//---
   ObjectCreate("SimultaneousReleaseIndex1",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT,"Four");
   ObjectCreate("SimultaneousReleaseIndex2",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT,"44");
   ObjectCreate("SimultaneousReleaseIndex3",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT,"Forty4");
   ObjectCreate("SimultaneousReleaseIndex4",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT,".1234567890");
  
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT)))
      Print("text1 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT)))
      Print("text2 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT)))
      Print("text3 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT)))
      Print("text4 is numeric");
  }
//---
bool IsNumeric(string text)
  {
   int length=StringLen(text);
   for(int i=0;i<length;i++)
     {
      int char1=StringGetChar(text,i);
      if((char1>47 && char1<58) || char1==46)
         continue;
      else
         return(false);
     }
   return(true);
  }  
//+------------------------------------------------------------------+
 
Ernst Van Der Merwe:
void OnStart()
  {
//---
   ObjectCreate("SimultaneousReleaseIndex1",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT,"Four");
   ObjectCreate("SimultaneousReleaseIndex2",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT,"44");
   ObjectCreate("SimultaneousReleaseIndex3",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT,"Forty4");
   ObjectCreate("SimultaneousReleaseIndex4",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT,".1234567890");
  
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT)))
      Print("text1 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT)))
      Print("text2 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT)))
      Print("text3 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT)))
      Print("text4 is numeric");
  }
//---
bool IsNumeric(string text)
  {
   int length=StringLen(text);
   for(int i=0;i<length;i++)
     {
      int char1=StringGetChar(text,i);
      if((char1>47 && char1<58) || char1==46)
         continue;
      else
         return(false);
     }
   return(true);
  }  
//+------------------------------------------------------------------+
honest_knave:

Sí, eso es un problema.

Podrías hacer una comparación de cadenas si el valor de fundición = 0

es decir, if(cast_value == 0 && str_value == "0")

Pero tendrías que pensar en que se introduzca 0.0 o 0.00.

Podrías reventar la cadena en un array de caracteres y probar cada carácter.

Depende de lo importante que sea.

Sí, ese tipo de cosas.

Tendrías que tener cuidado con:

  • Múltiples puntos decimales (pasaría pero no debería)
  • El uso de los símbolos + y - (no pasaría pero debería)
  • El uso de , como separador de miles o como punto decimal (no se aprobaría pero debería)
  • Un solo punto decimal sin otros caracteres (se aprobaría pero no debería)
  • Números que superan la capacidad del reparto
 
honest_knave:

Sí, ese tipo de cosas.

Habría que tener cuidado con:

  • Múltiples puntos decimales (pasaría pero no debería)
  • El uso de los símbolos + y - (no pasaría pero debería)
  • El uso de , como separador de miles o como punto decimal (no se aprobaría pero debería)
  • Un único punto decimal sin otros caracteres (se aprobaría pero no debería)
  • Números que superan la capacidad del molde
  • Espacios
 

Ernst Van Der Merwe:

  • Espacios

Sí, ¡buen punto!
Razón de la queja: