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

 
Ernst Van Der Merwe:
void OnStart()
  {
//---
   ObjectCreate("SimultaneousReleaseIndex1",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT,"Four");
   ObjectCreate("SimultaneousReleaseIndex2",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT,"44");
   ObjectCreate("SimultaneousReleaseIndex3",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT,"Forty4");
   ObjectCreate("SimultaneousReleaseIndex4",OBJ_LABEL,0,0,0);
   ObjectSetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT,".1234567890");
  
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex1",OBJPROP_TEXT)))
      Print("text1 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex2",OBJPROP_TEXT)))
      Print("text2 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex3",OBJPROP_TEXT)))
      Print("text3 is numeric");
   if(IsNumeric(ObjectGetString(0,"SimultaneousReleaseIndex4",OBJPROP_TEXT)))
      Print("text4 is numeric");
  }
//---
bool IsNumeric(string text)
  {
   int length=StringLen(text);
   for(int i=0;i<length;i++)
     {
      int char1=StringGetChar(text,i);
      if((char1>47 && char1<58) || char1==46)
         continue;
      else
         return(false);
     }
   return(true);
  }  
//+------------------------------------------------------------------+
Vielen Dank für Ihre Beispielcodes. Aber Ihr Schlüsselwort "IsNumeric" scheint nicht zu MQL4 zu gehören. Bitte korrigieren Sie mich, wenn ich falsch liege. Dennoch läuft Ihr Code sehr gut und dies ist ein perfektes Beispiel für das, was ich gesucht habe. Ich danke Ihnen.
 
macpee Aber Ihr Schlüsselwort "IsNumeric" scheint nicht zu MQL4 zu gehören. Bitte korrigieren Sie mich, wenn ich falsch liege.
Es ist kein Schlüsselwort, sondern eine Funktion, die er oben angegeben hat.
 
whroeder1:
Es handelt sich nicht um ein Schlüsselwort, sondern um eine Funktion, die er oben angegeben hat.
Oh, sieh mich an. Ich hätte es wissen müssen. Vielen Dank @whroeder1.
 
macpee:
Oh, sieh mich an. Ich hätte es wissen müssen. Vielen Dank @whroeder1.
Natürlich sollte ein Punkt (.) numerisch sein, da (.) als dasselbe angesehen wird wie ein Punkt und eine Null (.0), die in Wirklichkeit Null (0) ist. Jetzt habe ich versucht, die Anzahl der Punkte zu erhöhen (.....) und es wird immer noch als numerisch erkannt. Wir brauchen den Code für den Punkt (.), um den zusätzlichen Punkt (....) zu eliminieren, sobald der erste Punkt eingegeben wurde.
if((char1>47 && char1<58) || char1==46)
Übrigens kann ich die Liste des Codes nicht finden (ASCII, nehme ich an).

Eine andere Sache ist, wie man negative Zahlen eingibt. Der Code muss das Negationszeichen (-) nur am Anfang der Eingabe erfassen.

Und um den Code zu perfektionieren. Er muss das Negationszeichen (-) auch in der Mitte von Zahlen wie (45-20) akzeptieren und es als Subtraktion behandeln und auswerten und dann den Code
int char1=StringGetChar(text,i);
um zu prüfen, ob das Ergebnis numerisch ist. Wir können dies für alle vier binären Grundoperationen tun. Aber das ist für uns jetzt nicht wichtig.

Die ganze Idee ist, die OBJPROP_TEXT-Eigenschaft von OBT_EDIT so zu gestalten, dass sie wirtschaftliche Kalenderdaten akzeptiert und sie als die Zahlen behandelt, die sie sind. Aus diesem Grund ist eine eingebaute Funktion IsNumeric sehr wichtig, um zu vermeiden, dass unnötig viel Code dafür geschrieben wird.
 
macpee:
Natürlich sollte ein Punkt (.) numerisch sein, da (.) als dasselbe angesehen wird wie ein Punkt und eine Null (.0), die in Wirklichkeit Null (0) ist. Jetzt habe ich versucht, die Anzahl der Punkte zu erhöhen (.....) und es wird immer noch als numerisch erkannt. Wir brauchen den Code für den Punkt (.), um den zusätzlichen Punkt (....) zu eliminieren, sobald der erste Punkt eingegeben wurde.
if((char1>47 && char1<58) || char1==46)
Übrigens kann ich die Liste des Codes nicht finden (ASCII, nehme ich an).

Eine andere Sache ist, wie man negative Zahlen eingibt. Der Code muss das Negationszeichen (-) nur am Anfang der Eingabe erfassen.

Und um den Code zu perfektionieren. Er muss das Negationszeichen (-) auch in der Mitte von Zahlen wie (45-20) akzeptieren und es als Subtraktion behandeln und auswerten und dann den Code
int char1=StringGetChar(text,i);
um zu prüfen, ob das Ergebnis numerisch ist. Wir können dies für alle vier binären Grundoperationen tun. Aber das ist für uns jetzt nicht wichtig.

Die ganze Idee ist, die OBJPROP_TEXT-Eigenschaft von OBT_EDIT so zu gestalten, dass sie wirtschaftliche Kalenderdaten akzeptiert und sie als die Zahlen behandelt, die sie sind. Deshalb ist eine eingebaute Funktion IsNumeric sehr wichtig, um nicht unnötig viel Code dafür zu schreiben.
Eine andere Möglichkeit wäre, die Zeichenkette nach der IsNumeric-Prüfung in Double zu konvertieren.
 

macpee:
Of course a period (.) should be numeric since (.) is regarded as the same thing with a period and zero (.0) which is in fact zero (0). Now I tried increasing the number of period (.....) and it is still recognizing it as numeric. We need the code for period (.) so as to eliminate additional period (....) once the first period has been cited in

Ein weiterer Punkt ist die Eingabe negativer Zahlen. Der Code muss das Negationszeichen (-) nur am Anfang der Eingabe erfassen.

Gibt es hier ein Echo?

ehrlich_knave:

Ja, so etwas in der Art.

Sie müssen vorsichtig sein:

  • Mehrere Dezimalpunkte (würde passieren, sollte aber nicht)
  • Verwendung von + und - Symbolen (nicht zulässig, sollte aber möglich sein)
  • Verwendung von , entweder als Tausendertrennzeichen oder als Dezimalpunkt (wird nicht akzeptiert, sollte es aber)
  • Ein einziger Dezimalpunkt ohne andere Zeichen (würde bestehen, sollte aber nicht)
  • Zahlen, die das Fassungsvermögen des Kastens überschreiten
  • Leerzeichen

________________________________

macpee:

Übrigens kann ich die Liste des Codes nicht finden (ASCII, nehme ich an).

Na los, probieren Sie es aus. Ich weiß, dass du schon lange darauf wartest, deine Suchfähigkeiten zu verbessern.

________________________________

macpee:

Die ganze Idee ist, die OBJPROP_TEXT-Eigenschaft von OBT_EDIT dazu zu bringen, wirtschaftliche Kalenderdaten zu akzeptieren und sie als die Zahlen zu behandeln, die sie sind. Deshalb ist eine eingebaute Funktion IsNumeric sehr wichtig, um zu vermeiden, dass unnötig viel Code dafür geschrieben wird.

Vielleicht habe ich Ihre Absicht missverstanden, aber wenn Sie wollen, dass der Benutzer Daten in ein Eingabefeld eingibt und diese dann als Datumsangaben interpretiert (möglicherweise nicht, wenn Sie an negativen Zahlen interessiert sind), bin ich aus mehreren Gründen nicht davon überzeugt, dass dies der beste Ansatz ist.

 
honest_knave:

Gibt es hier ein Echo?

________________________________

Los, probieren Sie es aus. Ich weiß, dass du schon lange darauf wartest, deine Suchfähigkeiten verbessern zu können.

________________________________

Vielleicht habe ich Ihre Absicht falsch verstanden, aber wenn Sie möchten, dass der Benutzer Daten in ein Textfeld eingibt und diese dann als Datumsangaben interpretiert (möglicherweise nicht, wenn Sie an negativen Zahlen interessiert sind), bin ich nicht davon überzeugt, dass dies aus einer Reihe von Gründen der beste Ansatz ist.

Die fraglichen Wirtschaftsdaten enthalten keine Datumsangaben, sondern nur "tatsächliche", "prognostizierte", "frühere" und möglicherweise "revidierte" Daten. Natürlich haben wir auch nicht die Absicht, Symbole wie B(für Milliarde), %(für Prozent) usw. einzugeben. Nur reine reelle Zahlen ohne Leerzeichen. Die Idee ist, etwas zu berechnen, das ich "Simultaneous Release Index" nenne. Er soll eine Reihe von Wirtschaftsdaten, die gleichzeitig veröffentlicht werden, zusammenfassen und sie als ein Datum betrachten. Ich würde alle "Ist-Werte" zu einem "Ist-Wert", alle "Prognosen" zu einer "Prognose" usw. zusammenfassen, um die Beziehung zwischen dem kombinierten "Ist-Wert" und der kombinierten "Prognose" usw. zu sehen.

 
macpee:
if((char1>47 && char1<58) || char1==46)
Übrigens kann ich die Liste der Codes (ASCII, nehme ich an) nicht finden.
Kodieren Sie keine harten Zahlen. Machen Sie Ihren Code selbstdokumentierend.
if((char1>='0' && char1<='9') || char1=='.')
Zeichenkonstanten - Ganzzahlige Typen - Datentypen - Sprachgrundlagen - MQL4-Referenz
 
macpee:
Die fraglichen Wirtschaftsdaten enthalten keine Daten, sondern nur "aktuelle", "prognostizierte", "frühere" und möglicherweise "revidierte" Daten. Natürlich haben wir auch nicht die Absicht, Symbole wie B(für Milliarde), %(für Prozent) usw. einzugeben. Nur reine reelle Zahlen ohne Leerzeichen. Die Idee ist, etwas zu berechnen, das ich "Simultaneous Release Index" nenne. Er soll eine Reihe von Wirtschaftsdaten, die gleichzeitig veröffentlicht werden, zusammenfassen und sie als ein Datum betrachten. Ich würde alle "Ist-Werte" zu einem "Ist-Wert", alle "Prognosen" zu einer "Prognose" usw. zusammenfassen, um die Beziehung zwischen dem kombinierten "Ist-Wert" und der kombinierten "Prognose" usw. zu sehen.

So:

  • Übergeben Sie die Zeichenkette per Referenz
  • Die Leerzeichen werden entfernt
  • Entferne das ','
  • Ü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 Zeichenfolge in eine Zahl umwandeln.

 
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.

Sie mögen es wirklich kompliziert . Wenn es nur darum geht, reelle Zahlen zu verarbeiten, verwenden Sie StringToDouble() und eine Verarbeitung des Sonderfalls 0.