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

 
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);
  }  
//+------------------------------------------------------------------+
Merci pour vos exemples de codes. Mais votre mot-clé "IsNumeric" ne semble pas appartenir à MQL4. Veuillez me corriger si je me trompe. Pourtant, votre code fonctionne très bien et c'est un exemple parfait de ce que je cherchais. Je vous remercie.
 
macpee Mais votre mot-clé "IsNumeric" ne semble pas appartenir à MQL4. Veuillez me corriger si je me trompe.
Ce n'est pas un mot-clé, c'est une fonction qu'il a fournie ci-dessus.
 
whroeder1:
Pas un mot-clé, c'est une fonction qu'il a fournie ci-dessus.
Oh, regardez-moi. J'aurais dû le savoir. Merci @whroeder1.
 
macpee:
Oh, regardez-moi. J'aurais dû le savoir. Merci @whroeder1.
Bien sûr, un point (.) devrait être numérique puisque (.) est considéré comme la même chose qu'un point et un zéro (.0) qui est en fait zéro (0). Maintenant, j'ai essayé d'augmenter le nombre de points (.....) et il le reconnaît toujours comme numérique. Nous avons besoin du code pour le point (.) afin d'éliminer les points supplémentaires (....) une fois que le premier point a été cité.
if((char1>47 && char1<58) || char1==46)
A propos, je ne trouve pas la liste du code (ASCII, je suppose).

Une autre question est de savoir comment saisir les nombres négatifs. Le code doit saisir le signe de négation (-) uniquement au début de la saisie.

De plus, afin de perfectionner le code. Il doit accepter le symbole de négation (-) même au milieu de nombres tels que (45-20) et le traiter comme une soustraction et l'évaluer, puis utiliser le code
int char1=StringGetChar(text,i);
pour vérifier que le résultat est numérique. Nous pouvons faire cela pour les quatre opérations binaires de base. Mais cela n'est pas important pour nous maintenant.

L'idée est de faire en sorte que la propriété OBJPROP_TEXT de OBT_EDIT accepte les données du calendrier économique et les traite comme les nombres qu'elles sont. C'est pourquoi une fonction intégrée de IsNumeric est très importante pour éviter d'écrire un code inutilement volumineux pour cette fonction.
 
macpee:
Bien sûr, un point (.) devrait être numérique puisque (.) est considéré comme la même chose qu'un point et un zéro (.0) qui est en fait zéro (0). Maintenant, j'ai essayé d'augmenter le nombre de points (.....) et il le reconnaît toujours comme numérique. Nous avons besoin du code pour le point (.) afin d'éliminer les points supplémentaires (....) une fois que le premier point a été cité.
if((char1>47 && char1<58) || char1==46)
A propos, je ne trouve pas la liste du code (ASCII, je suppose).

Une autre question est de savoir comment saisir des nombres négatifs. Le code doit saisir le signe de négation (-) uniquement au début de la saisie.

De plus, afin de perfectionner le code. Il doit accepter le symbole de négation (-) même au milieu de nombres tels que (45-20) et le traiter comme une soustraction et l'évaluer, puis utiliser le code
int char1=StringGetChar(text,i);
pour vérifier que le résultat est numérique. Nous pouvons faire cela pour les quatre opérations binaires de base. Mais cela n'est pas important pour nous maintenant.

L'idée est de faire en sorte que la propriété OBJPROP_TEXT de OBT_EDIT accepte les données du calendrier économique et les traite comme les nombres qu'elles sont. C'est pourquoi une fonction intégrée de IsNumeric est très importante pour éviter d'écrire un code inutilement volumineux pour cette fonction.
Ou peut-être qu'une solution est de convertir la chaîne en double après la vérification de IsNumeric.
 

macpee:
Of course a period (.) should be numeric since (.) is regarded as the same thing with a period and zero (.0) which is in fact zero (0). Now I tried increasing the number of period (.....) and it is still recognizing it as numeric. We need the code for period (.) so as to eliminate additional period (....) once the first period has been cited in

Une autre question est de savoir comment saisir les nombres négatifs. Le code doit capturer le signe de négation (-) uniquement au début de la saisie.

Y a-t-il un écho ici ?

honnête_knave:

Oui, ce genre de chose.

Vous devez faire attention à :

  • les décimales multiples (passerait mais ne devrait pas)
  • L'utilisation des symboles + et - (ne passe 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

________________________________

macpee:

Au fait, je ne trouve pas la liste du code (ASCII, je présume).

Allez-y, essayez. Je sais que ça vous démange d'avoir l'occasion d'affiner vos compétences en matière de recherche.

________________________________

macpee:

L'idée générale est de faire en sorte que la propriété OBJPROP_TEXT de OBT_EDIT accepte les données du calendrier économique et les traite comme les chiffres qu'elles sont. C'est pourquoi une fonction intégrée de IsNumeric est très importante pour éviter d'écrire un code inutilement volumineux pour cette fonction.

J'ai peut-être mal compris votre intention, mais si vous voulez que l'utilisateur saisisse des dates dans une boîte d'édition et les interprète ensuite comme des dates-temps (peut-être pas si vous vous intéressez aux nombres négatifs), je ne suis pas convaincu que ce soit la meilleure approche pour un certain nombre de raisons.

 
honest_knave:

Y a-t-il un écho ici ?

________________________________

Allez-y, essayez. Je sais que ça te démange d'avoir une chance d'affiner tes compétences en recherche.

________________________________

J'ai peut-être mal compris votre intention, mais si vous voulez que l'utilisateur saisisse des dates dans une zone de texte et les interprète ensuite comme des dates (peut-être pas si vous vous intéressez aux nombres négatifs), je ne suis pas convaincu que ce soit la meilleure approche pour un certain nombre de raisons.

En fait, les données économiques en question ne comportent pas de dates - seulement des données "réelles", "prévues", "précédentes" et éventuellement "révisées". Bien entendu, nous n'avons pas non plus l'intention de saisir des symboles tels que B(pour milliard), %(pour pourcentage), etc. Juste des nombres réels purs sans espaces. L'idée est de calculer ce que j'appelle "l'indice de diffusion simultanée". Il s'agit de combiner un ensemble de données économiques publiées simultanément et de les considérer comme une seule donnée. Je combine tous les "réels" en un seul "réel", toutes les "prévisions" en une seule "prévision", etc., afin de voir la relation entre le "réel" combiné et la "prévision" combinée, etc.

 
macpee:
if((char1>47 && char1<58) || char1==46)
Au fait, je ne trouve pas la liste des codes (ASCII, je présume).
Ne codifiez pas les numéros en dur. Faites en sorte que votre code soit auto-documenté.
if((char1>='0' && char1<='9') || char1=='.')
Constantes de caractères - Types d'entiers - Types de données - Bases du langage - Référence MQL4
 
macpee:
En fait, les données économiques en question ne comportent pas de dates, mais seulement des données "réelles", "prévues", "précédentes" et éventuellement "révisées". Bien entendu, nous n'avons pas non plus l'intention de saisir des symboles tels que B(pour milliard), %(pour pourcentage), etc. Juste des nombres réels purs sans espaces. L'idée est de calculer ce que j'appelle "l'indice de diffusion simultanée". Il s'agit de combiner un ensemble de données économiques publiées simultanément et de les considérer comme une seule donnée. Je combine tous les "réels" en un seul "réel", toutes les "prévisions" en une seule "prévision", etc., afin de voir la relation entre le "réel" combiné et la "prévision" combinée, etc.

Donc :

  • Passer la chaîne par référence
  • Supprimez les espaces vides
  • Supprimez les ",".
  • Vérifiez que '+' ou '-' n'apparaissent qu'en tant que premier caractère.
  • Vérifiez que tous les autres caractères sont des chiffres compris entre 0 et 9.

Par exemple

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

Si le résultat est vrai, vous pouvez convertir la chaîne en un nombre.

 
honest_knave:

Donc :

  • Passer la chaîne par référence
  • Supprimez les espaces vides
  • Supprimez les ",".
  • Vérifiez qu'il n'y a qu'un seul ".
  • Vérifiez que '+' ou '-' n'apparaissent qu'en tant que premier caractère.
  • Vérifiez que tous les autres caractères sont des chiffres compris entre 0 et 9.

Par exemple

bool IsValidNumber(string &text)
  {
   StringReplace(text," ",NULL);
   StringReplace(text,",",NULL);
   int point_cnt = 0;
   for(int i=StringLen(text)-1; i>=0; i--)
     {
      int this_char = StringGetChar(text,i);
      if(this_char == '.')
        {
         point_cnt++;
         if(point_cnt>1)       return(false);
         if(StringLen(text)<2) return(false);
        }
      else if(this_char == '+' || this_char == '-')
        {
         if(i>0) return(false);
        }
      else if(this_char < '0' || this_char > '9') return(false);
     }
   return(true);
  }

Si le résultat est vrai, vous pouvez convertir la chaîne en un nombre.

Vous aimez vraiment la complication . Si le but est juste de traiter des nombres réels, utilisez StringToDouble() et un traitement du cas spécial 0.