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

 
Alain Verleyen:
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.
 
Google è vostro amico! Qui c'è un link per l'implementazione di "IsNumeric" in molti, molti linguaggi tra cui C e C++ (ma non MQL).

Ed eccone un altro che sembra più completo (alla fine della pagina):

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:
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.
La mia intenzione è la richiesta generale che hai presunto - se un numero è numerico, allora è numerico e può essere utilizzato per un calcolo ragionevole senza alcuna forma di errore derivante dalla natura dei numeri. Presenta un esempio di codice in MQL4 che ha a che fare con le espressioni regolari.
 
Sì, l'OP è qui ora e sente e vede tutte le soluzioni e controsoluzioni che sono state proposte finora. Apprezzo gli sforzi di tutti coloro che hanno commentato. Mi piacciono i codici di esempio presentati da honest_knave. In primo luogo, ha sostenuto i suoi commenti con i codici per tutto il tempo. In secondo luogo, non ha hard coded in nessuno dei suoi esempi. Inoltre, i suoi codici si occupano facilmente di qualsiasi forma di zero (0, 0.0, 0.00, .0, ecc), e sono facilmente comprensibili. Non credo che l'uso di StringToDouble() sia migliore, comunque.

Grazie a tutti voi @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen e Fernando Carreiro.
 
honest_knave:

Quindi:

  • Passare la stringa per riferimento
  • Elimina gli spazi vuoti
  • Elimina i ','.
  • Controlla che ci sia un solo '.
  • Controlla che '+' o '-' appaiano solo come primo carattere
  • Controlla che ogni altro carattere sia un numero tra 0 e 9

es.

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

Se restituisce true, puoi lanciare la stringa come un numero.

Ma ci sono altre cose che dobbiamo controllare. Mentre dobbiamo controllare che '+' o '-' appaia come primo carattere, dobbiamo anche controllare che non sia solo.
 
honest_knave:

Quindi:

  • Passare la stringa per riferimento
  • Elimina gli spazi vuoti
  • Elimina i ','.
  • Controlla che ci sia un solo '.
  • Controlla che '+' o '-' appaiano solo come primo carattere
  • Controlla che ogni altro carattere sia un numero tra 0 e 9

es.

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

Se restituisce true, puoi lanciare la stringa come un numero.

Mi sembra di aver risolto il problema (il '+' o il '-' da solo) aggiungendo/modificando il codice (i codici nelle caselle). Vedi l'immagine qui sotto.