![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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.
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...
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.
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.
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.
{
//---
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);
}
//+------------------------------------------------------------------+
{
//---
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);
}
//+------------------------------------------------------------------+
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:
Sí, ese tipo de cosas.
Habría que tener cuidado con:
Ernst Van Der Merwe: