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

 

MathIsValidNumber() akzeptiert einen Double. Bitte prüfen Sie die Dokumentation.

Sie geben einen String an.

Wenn Sie nicht ständig meine Kommentare über die Verwendung von #property strict ignorieren würden, würden Sie sehen, dass der Compiler Sie davor warnt.

Wenn Sie eine Zeichenkette aus Buchstaben nehmen und sie zu einem Double machen, wird der Wert des Double zu 0.

0 ist eine gültige Zahl.

Deshalb gibt Ihr Code true zurück.

 
honest_knave:

MathIsValidNumber() akzeptiert einen Double. Bitte prüfen Sie die Dokumentation.

Sie geben einen String an.

Wenn Sie nicht ständig meine Kommentare über die Verwendung von #property strict ignorieren würden, würden Sie sehen, dass der Compiler Sie davor warnt.

Wenn Sie eine Zeichenkette aus Buchstaben nehmen und sie zu einem Double machen, wird der Wert des Double zu 0.

0 ist eine gültige Zahl.

Deshalb gibt Ihr Code true zurück.

Aber Sie haben mir in Ihrer Antwort nicht gesagt, dass MathIsValidNumber() nur Double vergleicht, und nicht Strings. Übrigens, welche Zahl ist keine gültige Zahl? Außer komplexe Zahlen oder Unendlichkeiten, und wer will die schon in MQL4 verwenden. Wie auch immer, das "Schlüsselwort" scheint irreführend zu sein.
 
macpee:
Aber Sie haben mir in Ihrer Antwort nicht gesagt, dass MathIsValidNumber() nur Double vergleicht, und nicht Strings. Übrigens, welche Zahl ist keine gültige Zahl? Außer komplexe Zahlen oder Unendlichkeiten, und wer will die schon in MQL4 verwenden. Wie auch immer, das "Schlüsselwort" scheint irreführend zu sein.
Deshalb frage ich jetzt noch einmal: Wie lautet der Befehl, der dem Compiler sagt, dass er entscheiden soll, ob eine Variable eine Zeichenkette enthält und nicht irgendeine Form von Zahl? Vielen Dank für Ihre vorausschauende Antwort. In Visual Basic erinnere ich mich an ein Schlüsselwort wie "Isnumeric".
 
macpee:
Aber Sie haben mir in Ihrer Antwort nicht gesagt, dass MathIsValidNumber() nur Double vergleicht und nicht Strings.

Ich nahm an, Sie hätten sich die Mühe gemacht, die Dokumentation zu lesen...

Und wenn Sie nicht ständig meinen Rat über #property strict ignoriert hätten...

macpee:
Also frage ich noch einmal: Wie lautet der Befehl, der dem Compiler sagt, dass eine Variable eine Zeichenkette enthält und nicht irgendeine Form von Zahl? Vielen Dank für Ihre vorausschauende Antwort.

Wenn Sie nicht erwarten, dass der Wert jemals 0 sein wird, wandeln Sie den String in einen Double um und testen Sie, dass er nicht gleich 0 ist.

 
honest_knave:

Ich nahm an, Sie hätten sich die Mühe gemacht, die Dokumentation zu lesen...

Und wenn Sie meinen Rat über #property strict nicht ignoriert haben...

Wenn Sie nicht erwarten, dass der Wert jemals 0 sein wird, wandeln Sie den String in einen Double um und testen Sie, dass er nicht gleich 0 ist.

Gute Antwort. Ich kann es jetzt ausprobieren. Aber was passiert mit der Zahl Null. Ich nehme an, dass sie sowohl ein Double- als auch ein Integer-Wert ist. Wenn man String castet, gibt es 0 zurück, wenn man 0 eingibt, gibt es 0 zurück. Also...?
 
macpee:
Aber was passiert mit der Zahl Null. Ich nehme an, dass es sich sowohl um einen Double- als auch um einen Integer-Wert handelt. Wenn Sie die Zeichenkette umwandeln, wird 0 zurückgegeben, wenn Sie 0 eingeben, wird 0 zurückgegeben...?

Ja, das ist ein Problem.

Sie könnten einen String-Vergleich durchführen, wenn der Cast-Wert = 0 ist

d.h. if(cast_value == 0 && str_value == "0")

Aber Sie müssten sich überlegen, ob Sie 0,0 oder 0,00 eingeben wollen.

Sie könnten die Zeichenkette in ein Zeichenarray zerlegen und jedes Zeichen testen.

Das hängt davon ab, wie wichtig das ist.

 
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);
  }  
//+------------------------------------------------------------------+
 
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);
  }  
//+------------------------------------------------------------------+
honest_knave:

Ja, das ist ein Problem.

Sie könnten einen String-Vergleich durchführen, wenn der Cast-Wert = 0 ist

d.h. if(cast_value == 0 && str_value == "0")

Aber Sie müssten sich überlegen, ob Sie 0,0 oder 0,00 eingeben wollen.

Sie könnten die Zeichenkette in ein Zeichenarray zerlegen und jedes Zeichen testen.

Kommt darauf an, wie wichtig das ist.

Ja, so etwas in der Art.

Sie müssen vorsichtig sein:

  • Mehrere Dezimalpunkte (würde passieren, sollte aber nicht)
  • Verwendung von + und - Symbolen (würde nicht durchgehen, sollte aber)
  • 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 übersteigen
 
honest_knave:

Ja, so etwas in der Art.

Sie müssen vorsichtig sein:

  • Mehrere Dezimalpunkte (würde bestehen, sollte aber nicht)
  • Verwendung von + und - Symbolen (würde nicht durchgehen, sollte aber)
  • 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
 

Ernst Van Der Merwe:

  • Räume

Ja, guter Punkt!