Come controllo se il contenuto di una variabile è numerico? - pagina 2

 

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.

 
honest_knave:

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 infiniti, e chi vuole usarli in MQL4. Comunque, la "parola chiave" sembra fuorviante.
 
macpee:
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.
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. In visual basic, ricordo una parola chiave come "Isnumeric".
 
macpee:
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...

macpee:
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.

 
honest_knave:

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.

Buona risposta. Ora posso provare. 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...?
 
macpee:
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.

 
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ì, 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:

  • Punti decimali multipli (passerebbe ma non dovrebbe)
  • Uso dei simboli + e - (non passerebbe ma dovrebbe)
  • Uso di , come separatore delle migliaia o come punto decimale (non passerebbe ma dovrebbe)
  • Un solo punto decimale senza altri caratteri (passerebbe ma non dovrebbe)
  • Numeri oltre la capacità del cast
 
honest_knave:

Sì, questo genere di cose.

Dovresti stare attento a:

  • Punti decimali multipli (passerebbe ma non dovrebbe)
  • Uso dei simboli + e - (non passerebbe ma dovrebbe)
  • Uso di , come separatore delle migliaia o come punto decimale (non passerebbe ma dovrebbe)
  • Un solo punto decimale senza altri caratteri (passerebbe ma non dovrebbe)
  • Numeri oltre la capacità del calco
  • Spazi
 

Ernst Van Der Merwe:

  • Spazi

Sì, buona osservazione!