Comment vérifier si le contenu d'une variable est numérique ? - page 2

 

MathIsValidNumber() accepte un double. Veuillez consulter la documentation.

Vous lui donnez une chaîne de caractères.

Si vous n'ignoriez pas mes commentaires sur l'utilisation de #property strict, vous verriez que le compilateur vous avertit à ce sujet.

Si vous prenez une chaîne de lettres et la transformez en un double, la valeur du double devient 0.

0 est un nombre valide.

C'est pourquoi votre code renvoie vrai.

 
honest_knave:

MathIsValidNumber() accepte un double. Veuillez consulter la documentation.

Vous lui donnez une chaîne de caractères.

Si vous n'ignoriez pas mes commentaires sur l'utilisation de #property strict, vous verriez que le compilateur vous avertit à ce sujet.

Si vous prenez une chaîne de lettres et la transformez en un double, la valeur du double devient 0.

0 est un nombre valide.

C'est pourquoi votre code renvoie vrai.

Mais vous ne m'avez pas dit dans votre réponse que MathIsValidNumber() compare uniquement les doubles, et non les chaînes de caractères. D'ailleurs, quel nombre n'est pas un nombre valide ? Sauf les nombres complexes ou les infinis, et qui veut les utiliser dans MQL4 d'ailleurs. Quoi qu'il en soit, le "Keyword" semble trompeur.
 
macpee:
Mais vous ne m'avez pas dit dans votre réponse que MathIsValidNumber() compare uniquement les doubles, et non les chaînes de caractères. D'ailleurs, quel nombre n'est pas un nombre valide ? Sauf les nombres complexes ou les infinis, et qui veut les utiliser dans MQL4 d'ailleurs. Quoi qu'il en soit, le "Keyword" semble trompeur.
Je demande donc à nouveau, quelle est la commande pour dire au compilateur de décider si une variable contient une chaîne de caractères et non une forme quelconque de nombre ? Merci pour votre réponse anticipée. Dans Visual Basic, je me souviens d'un mot-clé tel que "Isnumeric".
 
macpee:
Mais vous ne m'avez pas dit dans votre réponse que MathIsValidNumber() compare uniquement les doubles, et non les chaînes de caractères.

J'ai supposé que vous auriez pris la peine de vérifier la documentation...

Et si tu n'avais pas continué à ignorer mes conseils sur les #propriétés strictes...

macpee:
Je demande donc à nouveau, quelle est la commande pour dire au compilateur de décider si une variable contient une chaîne de caractères et non une forme quelconque de nombre ? Merci pour votre réponse anticipée.

Si vous ne vous attendez pas à ce que la valeur soit jamais 0, convertissez la chaîne de caractères en un double et vérifiez qu'elle n'est pas égale à 0.

 
honest_knave:

J'ai supposé que vous auriez pris la peine de vérifier la documentation...

Et si vous ne l'avez pas fait, continuez à ignorer mes conseils sur #property strict...

Si vous ne vous attendez pas à ce que la valeur soit jamais 0, transformez la chaîne en un double et testez qu'elle n'est pas égale à 0.

Bonne réponse. Je peux maintenant l'essayer. Mais que se passe-t-il avec le chiffre zéro ? Je suppose qu'il s'agit d'une valeur double et d'une valeur entière. Lorsque vous lancez une chaîne de caractères, elle renvoie 0, lorsque vous entrez 0, elle renvoie 0. Donc... ?
 
macpee:
Mais que se passe-t-il avec le chiffre zéro ? Je présume qu'il s'agit d'une valeur double et d'une valeur entière. Lorsque vous lancez une chaîne de caractères, elle renvoie 0, lorsque vous entrez 0, elle renvoie 0. Donc... ?

Oui, c'est un problème.

Vous pourriez faire une comparaison de chaîne si la valeur cast = 0

c'est-à-dire if(cast_value == 0 && str_value == "0")

Mais il faudrait penser à la saisie de 0,0 ou 0,00.

Vous pourriez éclater la chaîne dans un tableau de caractères et tester chaque caractère.

Tout dépend de l'importance de la chose.

 
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:

Oui, c'est un problème.

Vous pourriez faire une comparaison de chaîne si la valeur cast = 0

c'est-à-dire if(cast_value == 0 && str_value == "0")

Mais il faudrait penser à la saisie de 0,0 ou 0,00.

Vous pourriez éclater la chaîne dans un tableau de caractères et tester chaque caractère.

Tout dépend de l'importance de la chose.

Oui, ce genre de chose.

Il faudrait faire attention à :

  • Les points décimaux multiples (pourrait passer mais ne devrait pas)
  • L'utilisation des symboles + et - (ne passerait pas mais devrait)
  • L'utilisation de , comme séparateur de milliers ou comme point décimal (ne passerait pas mais devrait)
  • Un seul point décimal sans aucun autre caractère (passerait mais ne devrait pas).
  • Nombres dépassant la capacité de la distribution
 
honest_knave:

Oui, ce genre de choses.

Il faut faire attention à :

  • Les points décimaux multiples (passerait mais ne devrait pas)
  • L'utilisation des symboles + et - (ne passerait pas mais devrait)
  • L'utilisation de , comme séparateur de milliers ou comme point décimal (ne passerait pas mais devrait)
  • Un point décimal solitaire sans aucun autre caractère (passerait mais ne devrait pas)
  • Nombres dépassant la capacité de la distribution
  • Espaces
 

Ernst Van Der Merwe:

  • Espaces

Oui, bon point !