変数の内容が数値かどうかを確認するにはどうしたらよいですか? - ページ 2

 

MathIsValidNumber() はdouble を受け付けます。ドキュメントを確認して ください。

あなたは文字列を与えて いるのです。

もしあなたが#property strictを 使うという私のコメントを無視し続けなければ、コンパイラがこのことについて警告しているのがわかるでしょう。

文字列をdoubleにすると、doubleの値は0に なります。

0は有効な数字です。

だから、あなたのコードはtrueを返しているのです。

 
honest_knave:

MathIsValidNumber() はdouble を受け付けます。ドキュメントを確認してください。

あなたは文字列を与えて いるのです。

もしあなたが#property strictを 使うという私のコメントを無視し続けなければ、コンパイラがこのことについて警告しているのがわかるでしょう。

文字列をdoubleにすると、doubleの値は0に なります。

0は有効な数字です。

だから、あなたのコードはtrueを返しているのです。

しかし、MathIsValidNumber()はdoubleのみを 比較し、文字列は比較しないことを回答で教えてくれませんでしたね。ところで、有効数字でない数字とはどのようなものでしょうか?複素数や無限大は別として、誰がMQL4でそれらを使いたいのでしょうか。いずれにせよ、"Keyword "は誤解を招きそうです。
 
macpee:
しかし、MathIsValidNumber()が比較するのはdoubleのみ で、stringは比較しないことを回答で教えてくれませんでしたね。ところで、どの数字が有効数字ではないのでしょうか?複素数や無限大は別として、誰がMQL4でそれらを使いたいのでしょうか。いずれにせよ、この「キーワード」は誤解を招きそうです。
つまり、変数が文字列を保持しているかどうかをコンパイラに判断させるコマンドは何でしょうか?予想通りの回答ありがとうございました。ビジュアルベーシックでは、「Isnumeric」のようなキーワードがあったと記憶しています。
 
macpee:
しかし、MathIsValidNumber()はdoubleのみを 比較し、文字列を比較しないことを回答では教えてくれませんでした。

ドキュメントを確認 したのかと思っていたのですが...。

そして、もしあなたが#property strictに関する私の助言を無視し続けなければ...

macpee
では、もう一度お聞きしますが、変数が数値ではなく文字列を保持しているかどうかをコンパイラに判断させるには、どのようなコマンドを使用すればよいのでしょうか?予想通りの回答ありがとうございます。

もし、値が0になることを想定していないのであれば、文字列をdoubleにタイプキャストして、0に等しくないかどうかテストすればよいでしょう。

 
honest_knave:

ドキュメントを確認したのかと思っていたのですが...。

そして、もしあなたが#property strictに関する私のアドバイスを無視し続けたのなら...

値が0になることを想定していないのであれば、文字列をdoubleにタイプキャストして、それが0に等しくないかどうかをテストしてください。

いい回答ですね。これで試せます。しかし、数字の0はどうなるのでしょう。整数値だけでなく、double値もあると推測されます。文字列をキャストすると0が返され、0を入力すると0が返される、では...?
 
macpee:
しかし、数字の0はどうなるのだろう。整数値だけでなく、2倍値もあるのだろう。文字列をキャストすると0が返され、0を入力すると0が返される、では...?

うん、それは問題だね。

キャスト値=0なら、文字列比較は可能です。

つまり、if(cast_value == 0 && str_value == "0") です。

しかし、0.0や0.00が入力されることを考えなければならない。

文字列を文字配列に分解して、各文字をテストすることもできます。

これがどの程度重要な のかにもよるが。

 
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:

うん、それは問題だね。

キャスト値=0なら、文字列比較は可能です。

つまり、if(cast_value == 0 && str_value == "0") です。

しかし、0.0や0.00が入力されることを考えなければならない。

文字列を文字配列に分解して、各文字をテストすることもできます。

どの程度重要かによるな。

ええ、そういうことです。

注意しなければならないのは

  • 小数点以下が複数ある場合(パスするはずだが、パスすべきでない)
  • と-記号の使用 (通らないが通るはず)
  • を千の区切り文字として、または小数点として使用すること(通らないが、通らなければならない)
  • 他の文字がない単独の小数点(合格だが不合格)
  • キャストのキャパシティを超える数字
 
honest_knave:

そうですね、そういうことです。

注意しなければならないのは

  • 小数点以下が複数ある(パスするけど、パスすべきでない)
  • と-記号の使用(パスしないが、パスする必要がある)
  • を千の区切り文字として、または小数点として使用すること(通らないが、通らなければならない)
  • 他の文字がない単独の小数点(合格だが不合格)
  • キャストの許容量を超える数字
  • スペース
 

Ernst Van Der Merwe:

  • 空間

はい、いいこと聞きました