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

 
Alain Verleyen:
Vi piace molto la complicazione. Se l'obiettivo è solo quello di elaborare numeri reali, usate StringToDouble() e un'elaborazione del caso speciale 0.

Questa era la soluzione iniziale:

honest_knave:

Se non vi aspettate che il valore sia mai 0, fate il type-cast della stringa in un doppio e verificate che non sia uguale a 0.

Tuttavia, l'OP voleva essere in grado di distinguere se 0 era il valore inserito, o se 0 era il risultato della stringa che era un numero non valido. Sia "0" che "sfdlgkjsflkjdsklfsd" risulteranno 0 con StringToDouble() o (double).

Questo era inaccettabile per l'OP che poi ha generato questa discussione successiva.

 
honest_knave:

Questa era la soluzione iniziale:

Tuttavia, l'OP voleva essere in grado di distinguere se 0 era il valore inserito, o se 0 era il risultato della stringa che era un numero non valido. Sia "0" che "sfdlgkjsflkjdsklfsd" danno come risultato 0 con StringToDouble() o (double).

Questo era inaccettabile per l'OP che ha poi generato questa successiva discussione.

Ecco perché ho detto "e un'elaborazione del caso speciale 0".

Esempio semplificato:
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
Ecco perché ho detto "e un'elaborazione del caso speciale 0".

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

E che dire di 0,00?

O +0.00?

O .0?


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.

 
honest_knave:

E che dire di 0,00?

O +0.00?

O .0?


Ecco perché ho detto "esempio semplificato". Non farò il lavoro per l'OP.

 
Alain Verleyen:
Ecco perché ho detto "esempio semplificato". Non farò il lavoro per l'OP.

È un esercizio interessante, tuttavia: è meglio avere una lista di possibili variazioni di "0", o semplicemente testare tutto?

Il primo è probabilmente più veloce, ma con il rischio di perdere una variazione legittima.

Tuttavia, quanto è importante la velocità quando dovrebbe essere testato solo su unCHARTEVENT_OBJECT_ENDEDIT?

Indipendentemente da ciò, sono sicuro che l'OP ora ha molto da fare!

 
honest_knave:

È un esercizio interessante, tuttavia: è meglio avere una lista di possibili variazioni di "0", o semplicemente testare tutto?

Il primo è probabilmente più veloce, ma con il rischio di perdere una variazione legittima.

Tuttavia, quanto è importante la velocità quando dovrebbe essere testato solo su unCHARTEVENT_OBJECT_ENDEDIT?

Indipendentemente da ciò, sono sicuro che l'OP ora ha molto da fare!

Si potrebbe anche chiedere di inserire zero come "0" e rifiutare tutti gli altri casi.

O usando un'espressione regolare:-D
 
Alain Verleyen:
Si potrebbe anche chiedere di inserire zero come "0" e rifiutare tutti gli altri casi.

O usando un'espressione regolare :-D

Personalmente, adotterei un approccio come questo:

Una volta che ENDEDIT accade, cast l'OBJ_TEXT in un doppio e poi spingerlo di nuovo nella casella di modifica come una stringa (usando StringFormat() se volessi controllare il formato). L'utente vedrà immediatamente il risultato delle sue azioni e potrà cambiarlo se non è adatto alle sue esigenze, oppure lasciarlo.

es.

#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:

Personalmente, adotterei un approccio come questo:

Una volta che ENDEDIT accade, cast l'OBJ_TEXT in un doppio e poi spingerlo di nuovo nella casella di modifica come una stringa (usando StringFormat() se volessi controllare il formato). L'utente vedrà immediatamente il risultato delle sue azioni e potrà cambiarlo se non è adatto alle sue esigenze, oppure lasciarlo.

es.

#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);
     }
  }

Avrete bisogno di un modo per convalidare l'input. (un pulsante aggiuntivo ?)

Mantenetelo semplice. Comunque, come desideri :p

 
Alain Verleyen:

Avrai bisogno di un modo per convalidare il tuo input. (un pulsante aggiuntivo?)

Non sono sicuro di seguire...?

Potrei aver frainteso l'intenzione dell'OP, ma credo che l'interfaccia sarà dinamica, cioè un cambiamento in questa casella di modifica comporterà un aggiornamento di un'altra casella di conseguenza.

Si potrebbe avere un pulsante di convalida, ma se il risultato viene semplicemente visualizzato (piuttosto che agire) potrebbe essere un'aggiunta non necessaria. Ma non sono sicuro - l'OP avrebbe bisogno di chiarire.

Alain Verleyen:

Mantienilo semplice. Comunque, come vuoi tu :p

Sono molto d'accordo con il mantenere le cose semplici. C'è qualcosa di più semplice di questo?

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

PS Non sono sicuro che sia come desidero, è solo una discussione accademica per me - non ne ho bisogno!

 
honest_knave:

Non sono sicuro di seguire...?

...
Onestamente non ho idea dell'intenzione dell'OP
Se la prendiamo come una richiesta generale: "Come controllare se il contenuto di una variabile è numerico?", la soluzione più elegante è usare un'espressione regolare.