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

 
Alain Verleyen:
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.

C'était la solution initiale :

honest_knave:

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

Cependant, l'OP voulait être capable de distinguer si 0 était la valeur entrée, ou si 0 était le résultat de la chaîne étant un nombre invalide. Les deux "0" et "sfdlgkjsflkjdsklfsd" vont donner 0 avec StringToDouble() ou (double).

Ceci était inacceptable pour le PO qui a ensuite engendré cette discussion ultérieure.

 
honest_knave:

C'était la solution initiale :

Cependant, l'OP voulait être capable de distinguer si 0 était la valeur entrée, ou si 0 était le résultat de la chaîne étant un nombre invalide. Les deux "0" et "sfdlgkjsflkjdsklfsd" vont donner 0 avec StringToDouble() ou (double).

Ceci était inacceptable pour le PO qui a alors engendré cette discussion ultérieure.

C'est pourquoi j'ai dit "et un traitement du cas spécial 0".

Exemple simplifié :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
C'est pourquoi j'ai dit "et un traitement du cas spécial 0".

Exemple simplifié :
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }

Et qu'en est-il de 0.00 ?

Ou +0,00 ?

Ou .0 ?


honest_knave:

Oui, c'est un problème.

Vous pourriez faire une comparaison de chaîne si la valeur coulée = 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.

 
honest_knave:

Et qu'en est-il de 0.00 ?

Ou +0,00 ?

Ou .0 ?


C'est pourquoi j'ai dit "exemple simplifié". Je ne vais pas faire le travail pour le PO.

 
Alain Verleyen:
C'est pourquoi j'ai dit "exemple simplifié". Je ne vais pas faire le travail à la place du PO.

C'est un exercice intéressant, néanmoins : vaut-il mieux avoir une liste de variations possibles de "0", ou bien tout tester ?

La première solution est sans doute plus rapide, mais elle comporte le risque de manquer une variation légitime.

Cependant, quelle est l'importance de la rapidité lorsqu'elle ne doit être testée que sur unCHARTEVENT_OBJECT_ENDEDIT?

Quoi qu'il en soit, je suis sûr que le PO a maintenant beaucoup d'éléments sur lesquels s'appuyer !

 
honest_knave:

C'est un exercice intéressant, néanmoins : vaut-il mieux avoir une liste de variations possibles de "0", ou bien tout tester ?

La première solution est sans doute plus rapide, mais elle comporte le risque de manquer une variation légitime.

Cependant, quelle est l'importance de la rapidité lorsqu'elle ne doit être testée que sur unCHARTEVENT_OBJECT_ENDEDIT?

Quoi qu'il en soit, je suis sûr que l'OP a maintenant beaucoup à faire !

Vous pourriez également demander à ce que le zéro soit saisi comme "0" et rejeter tous les autres cas.

Ou utiliser une expression régulière:-D
 
Alain Verleyen:
Vous pourriez également demander à ce que le zéro soit saisi comme "0" et rejeter tous les autres cas.

Ou utiliser une expression régulière :-D

Personnellement, j'adopterais une approche comme celle-ci :

Dès que ENDEDIT se produit, je transforme le OBJ_TEXT en un double, puis je le repousse dans la boîte d'édition sous forme de chaîne (en utilisant StringFormat() si je veux contrôler le format). L'utilisateur verra immédiatement le résultat de ses actions et pourra soit le modifier s'il ne convient pas à ses besoins, soit le laisser.

Par exemple

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }
 
honest_knave:

Personnellement, j'adopterais une approche comme celle-ci :

Dès que ENDEDIT se produit, je transforme le OBJ_TEXT en un double, puis je le repousse dans la boîte d'édition sous forme de chaîne (en utilisant StringFormat() si je veux contrôler le format). L'utilisateur verra immédiatement le résultat de ses actions et pourra soit le modifier s'il ne convient pas à ses besoins, soit le laisser.

Par exemple

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }

Vous aurez besoin d'un moyen de valider votre entrée. (un bouton supplémentaire ?)

Restez simple. Bref, comme vous voulez :p

 
Alain Verleyen:

Vous aurez besoin d'un moyen de valider votre entrée. (un bouton supplémentaire ?)

Je ne suis pas sûr de suivre... ?

J'ai peut-être mal compris l'intention de l'OP, mais je crois que l'interface sera dynamique, c'est-à-dire qu'un changement dans cette boîte d'édition entraînera une mise à jour d'une autre boîte en conséquence.

Vous pourriez avoir un bouton de validation, mais si le résultat est simplement affiché (plutôt qu'une action), cela pourrait être un ajout inutile. Mais je ne suis pas sûr - le PO devrait clarifier.

Alain Verleyen:

Gardez les choses simples. Bref, comme vous voulez :p

Je suis tout à fait d'accord pour garder les choses simples. Peut-on faire plus simple que cela ?

      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);

PS : je ne suis pas sûr que ce soit ce que je souhaite, c'est juste une discussion académique pour moi - je n'en ai pas besoin !

 
honest_knave:

Je ne suis pas sûr de suivre... ?

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