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

 
Alain Verleyen:
Très honnêtement, je n'ai aucune idée de l'intention de l'OP.
Si on le prend comme une demande générale : "Comment vérifier si le contenu d'une variable est numérique ?", la solution la plus élégante est d'utiliser une expression régulière.
 
Google est votre ami ! Voici un lien pour l'implémentation de "IsNumeric" dans de très nombreux langages, y compris C et C++ (mais pas MQL).

Et en voici un autre qui semble plus complet (à la toute fin de la page) :

Determine if a string is numeric - Rosetta Code
Determine if a string is numeric - Rosetta Code
  • rosettacode.org
Create a boolean function which takes in a string and tells whether it is a numeric string (floating point and negative numbers included) in the syntax the language uses for numeric literals or numbers converted from strings. The first file is the package interface containing the declaration of the Is_Numeric function. The second file is the...
 
Alain Verleyen:
Honnêtement, je n'ai aucune idée de l'intention de l'OP
Si nous le prenons comme une demande générale : "Comment vérifier si le contenu d'une variable est numérique ?", la solution la plus élégante est d'utiliser une expression régulière.
Mon intention est la demande générale que vous avez présumée : si un nombre est numérique, alors il est numérique et peut être utilisé pour un calcul raisonnable sans aucune forme d'erreur découlant de la nature des nombres. Présentez un exemple de code dans MQL4 qui a à voir avec l'expression régulière.
 
Oui, le PO est ici maintenant et il entend et voit toutes les solutions et contre-solutions qui ont été proposées jusqu'à présent. J'apprécie les efforts de tous ceux qui ont commenté. J'aime les exemples de codes présentés par honest_knave. Premièrement, il a toujours étayé ses commentaires par des codes. Deuxièmement, il n'a pas codé en dur dans aucun de ses exemples. De plus, ses codes prennent facilement en charge toute forme de zéro (0, 0.0, 0.00, .0, etc), et ils sont faciles à comprendre. Je ne pense pas que l'utilisation de StringToDouble() soit meilleure, de toute façon.

Merci à vous tous @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen et Fernando Carreiro.
 
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.

Mais il y a d'autres choses que nous devons vérifier. Si nous devons vérifier que '+' ou '-' apparaît comme premier caractère, nous devons également vérifier qu'il n'est pas seul.
 
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.

Il semble que j'ai résolu le problème (le '+' ou le '-' autonome) en ajoutant/modifiant le code (les codes dans les cases). Voir l'image ci-dessous.