![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
MathIsValidNumber() accetta un doppio. Controllate la documentazione.
Voi gli state dando una stringa.
Se non continuassi ad ignorare i miei commenti sull'uso di #property strict vedresti che il compilatore ti avverte di questo.
Se prendi una stringa di lettere e la trasformi in un doppio, il valore del doppio diventa 0.
0 è un numero valido.
Ecco perché il tuo codice restituisce true.
MathIsValidNumber() accetta un doppio. Controllate la documentazione.
Voi gli state dando una stringa.
Se non continuassi ad ignorare i miei commenti sull'uso di #property strict vedresti che il compilatore ti avverte di questo.
Se prendi una stringa di lettere e la trasformi in un doppio, il valore del doppio diventa 0.
0 è un numero valido.
Ecco perché il tuo codice restituisce true.
Ma non mi hai detto nella tua risposta che MathIsValidNumber() confronta solo i doppi e non le stringhe. A proposito, quale numero non è un numero valido? Tranne i numeri complessi o gli infiniti, e chi vuole usarli in MQL4 a proposito. Comunque, la "parola chiave" sembra fuorviante.
Ma non mi hai detto nella tua risposta che MathIsValidNumber() confronta solo i doppi e non le stringhe.
Presumevo che ti fossi preso la briga di controllare la documentazione...
E se non avessi continuato a ignorare i miei consigli sulla #proprietà rigorosa...
Quindi ora chiedo di nuovo, qual è il comando per dire al compilatore di decidere se una variabile contiene una stringa e non una qualsiasi forma di numero? Grazie per la tua risposta anticipata.
Se non ti aspetti che il valore sia mai 0, fai il type-cast della stringa in un doppio e verifica che non sia uguale a 0.
Presumevo che ti fossi preso la briga di controllare la documentazione...
E se non l'hai fatto continua ad ignorare il mio consiglio sulla #proprietà rigorosa...
Se non ti aspetti che il valore sia mai 0, fai il type-cast della stringa in un doppio e verifica che non sia uguale a 0.
Ma cosa succede al numero zero. Presumo che sia un valore doppio così come un valore intero. Quando si lancia la stringa restituisce 0, quando si inserisce 0, restituisce 0. Quindi...?
Sì, questo è un problema.
Potresti fare un confronto di stringhe se il valore cast = 0
cioè if(cast_value == 0 && str_value == "0")
Ma dovreste pensare all'inserimento di 0,0 o 0,00.
Potresti scoppiare la stringa in un array di caratteri e testare ogni carattere.
Dipende da quanto è importante.
{
//---
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ì, questo è un problema.
Potresti fare un confronto di stringhe se il valore cast = 0
cioè if(cast_value == 0 && str_value == "0")
Ma dovreste pensare all'inserimento di 0.0 o 0.00.
Potresti scoppiare la stringa in un array di caratteri e testare ogni carattere.
Dipende da quanto è importante.
Sì, questo genere di cose.
Dovresti stare attento a:
Sì, questo genere di cose.
Dovresti stare attento a:
Ernst Van Der Merwe: