Wie prüfe ich, ob der Inhalt einer Variablen numerisch ist? - Seite 5

 
Alain Verleyen:
Um ehrlich zu sein, habe ich keine Ahnung, was die Absicht des Auftraggebers ist.
Wenn wir es als eine allgemeine Anfrage verstehen: "Wie kann man prüfen, ob der Inhalt einer Variablen numerisch ist?", ist die eleganteste Lösung die Verwendung eines regulären Ausdrucks.
 
Google ist Ihr Freund! Hier ist ein Link für die Implementierung von "IsNumeric" in vielen, vielen Sprachen, einschließlich C und C++ (aber nicht MQL).

Und hier ist eine andere, die vollständiger zu sein scheint (ganz am Ende der Seite):

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:
Ehrlich gesagt habe ich keine Ahnung von der Absicht des Auftraggebers
Wenn wir es als allgemeine Anfrage verstehen: "Wie kann man prüfen, ob der Inhalt einer Variablen numerisch ist?", ist die eleganteste Lösung die Verwendung eines regulären Ausdrucks.
Meine Absicht ist die allgemeine Anfrage, von der Sie ausgegangen sind - wenn eine Zahl numerisch ist, dann ist sie numerisch und kann für eine vernünftige Berechnung verwendet werden, ohne dass irgendeine Form von Fehler aufgrund der Natur der Zahlen auftritt. Stellen Sie einen Beispielcode in MQL4 vor, der mit regulären Ausdrücken zu tun hat.
 
Ja, der Auftraggeber ist jetzt hier, und er hört und sieht all die Lösungen und Gegenlösungen, die bisher vorgeschlagen wurden. Ich schätze die Bemühungen all derer, die kommentiert haben. Mir gefallen die von honest_knave vorgestellten Beispielcodes. Erstens hat er seine Kommentare die ganze Zeit über mit Codes untermauert. Zweitens hat er in keinem seiner Beispiele hart kodiert. Außerdem haben seine Codes jede Form von Null (0, 0.0, 0.00, .0, usw.) problemlos berücksichtigt, und sie sind leicht verständlich. Ich glaube nicht, dass die Verwendung von StringToDouble() besser ist.

Vielen Dank an euch alle @ whroeder1, honest_knave, Ernst Van Der Merwe, Alain Verleyen und Fernando Carreiro.
 
honest_knave:

So:

  • Übergeben Sie die Zeichenkette per Referenz
  • Die Leerzeichen werden entfernt
  • Entferne das ','
  • Überprüfen Sie, dass es nur ein '.' gibt.
  • Überprüfen Sie, dass '+' oder '-' nur als erstes Zeichen vorkommt
  • Überprüfen Sie, dass jedes zweite Zeichen eine Zahl zwischen 0 und 9 ist.

z.B..

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

Wenn das Ergebnis wahr ist, können Sie die Zeichenkette in eine Zahl umwandeln.

Aber es gibt noch einige weitere Dinge, die wir überprüfen müssen. Wir müssen zwar prüfen, ob '+' oder '-' als erstes Zeichen erscheint, aber auch, ob es nicht allein steht.
 
honest_knave:

So:

  • Übergeben Sie die Zeichenkette per Referenz
  • Die Leerzeichen werden entfernt
  • Entferne das ','
  • Prüfen Sie, ob es nur ein '.' gibt.
  • Überprüfen Sie, dass '+' oder '-' nur als erstes Zeichen vorkommt
  • Überprüfen Sie, dass jedes zweite Zeichen eine Zahl zwischen 0 und 9 ist.

z.B..

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

Wenn das Ergebnis wahr ist, können Sie die Zeichenkette in eine Zahl umwandeln.

Ich scheine das Problem (eigenständiges '+' oder '-') durch Hinzufügen/Ändern des Codes (die Codes in den Kästen) gelöst zu haben. Siehe Bild unten.