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

 
Alain Verleyen:
あなたは本当に複雑なことが好きなんですね。実数を処理するのが目的なら、StringToDouble() を使って、特殊ケースである0を処理すればいいのです。

これが最初の解決策でした。

honest_knave:

値が0になることを想定していない場合は、文字列をdoubleにタイプキャストして、0に等しくないかどうかをテストします。

しかし、OPは、0が入力された値なのか、それとも文字列が無効な数値であった結果0になったのかを区別して処理できるようにしたいと考えました。0 "も "sfdlgkjsflkjdsklfsd "もStringToDouble()や(double)で0になってしまう。

これはOPにとって受け入れがたいことで、この後の議論が生まれました。

 
honest_knave:

これが最初の解決策でした。

しかし、OPは0が入力された値なのか、それとも文字列が無効な数値であった結果0になったのかを区別して処理できるようにしたかったのです。0 "と "sfdlgkjsflkjdsklfsd "はどちらもStringToDouble()や(double)で0となります。

これはOPにとって受け入れがたいことで、その後のこの議論が生まれました。

だから、"特殊ケース0の処理も "と言ったのです。

簡略化した例.
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }
 
Alain Verleyen:
だから、"特殊ケース0の処理も "と言ったんです。

簡単な例:
   double value=StringToDouble(inputs);
   if(value==0)
     {
      if(inputs=="0" || inputs=="0.0")
        {
         //--- all is ok                
        }
      else
        {
         //--- wrong inputs
        }
     }

また、0.00はどうでしょうか?

それとも+0.00?

あるいは0.0?


honest_knave:

はい、それは問題です。

もしキャスト値=0なら、文字列比較をすることができます。

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

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

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

これがどの程度重要なのかにもよりますが。

 
honest_knave:

また、0.00はどうでしょうか?

それとも+0.00?

あるいは0.0?


だから、「簡略化した例」と言ったのです。私はOPのために仕事をするつもりはありません。

 
Alain Verleyen:
だから、私は「簡略化した例」と言ったのです。私は、OPのために仕事をするつもりはありません。

0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?

前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。

しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要な のでしょうか?

ともあれ、OPは今、たくさんのことを学んでいるはずです。

 
honest_knave:

0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?

前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。

しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要なのでしょうか?

いずれにせよ、OPは今、多くのことを行っていると確信しています。

ゼロを "0 "と入力し、それ以外のケースを拒否するように依頼することもできます。

または正規表現を 使用する :-D
 
Alain Verleyen:
ゼロを "0 "と入力し、それ以外を拒否するように要求することもできます。あるいは正規表現を使う :-D

個人的には、次のようなアプローチを取ります。

ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御 したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }
 
honest_knave:

個人的には、次のようなアプローチを取ります。

ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。

#property strict

#define EDIT_BOX "EditBox"

int OnInit()
  {
   ObjectCreate    (0, EDIT_BOX, OBJ_EDIT000);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE200);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE100);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE,  20);
   ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGNALIGN_CENTER);
   ObjectSetString (0, EDIT_BOX, OBJPROP_TEXT"Enter Value");
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   ObjectDelete(0, EDIT_BOX);
  }

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==EDIT_BOX)
     {
      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
     }
  }

入力を検証する方法が必要です。(追加のボタン?)

シンプルにしてください。とにかく、お好きなように :p

 
Alain Verleyen:

入力内容を検証する方法が必要です。(追加のボタン ?)

よくわからないのですが......?

OPの意図を誤解しているかもしれませんが、インターフェイスは動的なものであると思います。

検証ボタンがあってもいいのですが、結果が単に表示されるだけなら(アクションを起こすのではなく)、不要な追加かもしれません。しかし、私はよくわかりません。OPは明確にする必要があります。

アラン・ヴェルレーエン

シンプルにしましょう。とにかく、お好きなように:p

物事をシンプルに保つことにとても同意します。これ以上シンプルにすることはないでしょう?

      double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT);
      ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);

PS 私の希望通りかどうかは分かりませんが、私にとっては単なる学術的な議論に過ぎません。

 
honest_knave:

よくわからないのですが......?

...
正直なところ、私はOPの意図が全くわかりません。
もし、一般的な要望として「変数の中身が数値かどうかを調べるには どうしたらいいか」 と考えるなら、最もエレガントな解決策は正規表現を使うことです。