変数の内容が数値かどうかを確認するにはどうしたらよいですか? - ページ 4 12345 新しいコメント honest_knave 2017.02.17 14:58 #31 Alain Verleyen: あなたは本当に複雑なことが好きなんですね。実数を処理するのが目的なら、StringToDouble() を使って、特殊ケースである0を処理すればいいのです。これが最初の解決策でした。 honest_knave:値が0になることを想定していない場合は、文字列をdoubleにタイプキャストして、0に等しくないかどうかをテストします。しかし、OPは、0が入力された値なのか、それとも文字列が無効な数値であった結果0になったのかを区別して処理できるようにしたいと考えました。0 "も "sfdlgkjsflkjdsklfsd "もStringToDouble()や(double)で0になってしまう。これはOPにとって受け入れがたいことで、この後の議論が生まれました。 Alain Verleyen 2017.02.17 15:06 #32 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 } } honest_knave 2017.02.17 15:06 #33 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が入力されることを考えなければならない。文字列を文字配列に分解して、各文字をテストすることもできます。これがどの程度重要なのかにもよりますが。 Alain Verleyen 2017.02.17 15:25 #34 honest_knave:また、0.00はどうでしょうか?それとも+0.00?あるいは0.0? だから、「簡略化した例」と言ったのです。私はOPのために仕事をするつもりはありません。 honest_knave 2017.02.17 15:34 #35 Alain Verleyen: だから、私は「簡略化した例」と言ったのです。私は、OPのために仕事をするつもりはありません。0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要な のでしょうか?ともあれ、OPは今、たくさんのことを学んでいるはずです。 Alain Verleyen 2017.02.17 15:48 #36 honest_knave: 0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要なのでしょうか?いずれにせよ、OPは今、多くのことを行っていると確信しています。 ゼロを "0 "と入力し、それ以外のケースを拒否するように依頼することもできます。 または正規表現を 使用する :-D honest_knave 2017.02.17 15:52 #37 Alain Verleyen: ゼロを "0 "と入力し、それ以外を拒否するように要求することもできます。あるいは正規表現を使う :-D個人的には、次のようなアプローチを取ります。ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御 したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。例#property strict#define EDIT_BOX "EditBox"int OnInit() { ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20); ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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); } } How do I check エキスパートアドバイザー - 雑多な質問 Help with chart event Alain Verleyen 2017.02.17 17:18 #38 honest_knave:個人的には、次のようなアプローチを取ります。ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。例#property strict#define EDIT_BOX "EditBox"int OnInit() { ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200); ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100); ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20); ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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 honest_knave 2017.02.17 17:30 #39 Alain Verleyen:入力内容を検証する方法が必要です。(追加のボタン ?)よくわからないのですが......?OPの意図を誤解しているかもしれませんが、インターフェイスは動的なものであると思います。検証ボタンがあってもいいのですが、結果が単に表示されるだけなら(アクションを起こすのではなく)、不要な追加かもしれません。しかし、私はよくわかりません。OPは明確にする必要があります。アラン・ヴェルレーエンシンプルにしましょう。とにかく、お好きなように:p物事をシンプルに保つことにとても同意します。これ以上シンプルにすることはないでしょう? double value = (double) ObjectGetString(0, EDIT_BOX, OBJPROP_TEXT); ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);PS 私の希望通りかどうかは分かりませんが、私にとっては単なる学術的な議論に過ぎません。 Alain Verleyen 2017.02.17 19:52 #40 honest_knave: よくわからないのですが......?... 正直なところ、私はOPの意図が全くわかりません。 もし、一般的な要望として「変数の中身が数値かどうかを調べるには どうしたらいいか」 と考えるなら、最もエレガントな解決策は正規表現を使うことです。 12345 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
あなたは本当に複雑なことが好きなんですね。実数を処理するのが目的なら、StringToDouble() を使って、特殊ケースである0を処理すればいいのです。
これが最初の解決策でした。
値が0になることを想定していない場合は、文字列をdoubleにタイプキャストして、0に等しくないかどうかをテストします。
しかし、OPは、0が入力された値なのか、それとも文字列が無効な数値であった結果0になったのかを区別して処理できるようにしたいと考えました。0 "も "sfdlgkjsflkjdsklfsd "もStringToDouble()や(double)で0になってしまう。
これはOPにとって受け入れがたいことで、この後の議論が生まれました。
これが最初の解決策でした。
しかし、OPは0が入力された値なのか、それとも文字列が無効な数値であった結果0になったのかを区別して処理できるようにしたかったのです。0 "と "sfdlgkjsflkjdsklfsd "はどちらもStringToDouble()や(double)で0となります。
これはOPにとって受け入れがたいことで、その後のこの議論が生まれました。
簡略化した例.
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
だから、"特殊ケース0の処理も "と言ったんです。
簡単な例:
if(value==0)
{
if(inputs=="0" || inputs=="0.0")
{
//--- all is ok
}
else
{
//--- wrong inputs
}
}
また、0.00はどうでしょうか?
それとも+0.00?
あるいは0.0?
はい、それは問題です。
もしキャスト値=0なら、文字列比較をすることができます。
つまり、if(cast_value == 0 && str_value == "0") です。
しかし、0.0や0.00が入力されることを考えなければならない。
文字列を文字配列に分解して、各文字をテストすることもできます。
これがどの程度重要なのかにもよりますが。
また、0.00はどうでしょうか?
それとも+0.00?
あるいは0.0?
だから、私は「簡略化した例」と言ったのです。私は、OPのために仕事をするつもりはありません。
0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?
前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。
しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要な のでしょうか?
ともあれ、OPは今、たくさんのことを学んでいるはずです。
0 "の可能性のあるバリエーションをリストアップするのが良いのか、それともすべてをテスト するのが良いのか?
前者の方が間違いなく速いですが、正当なバリエーションを見逃す危険性があります。
しかし、CHARTEVENT_OBJECT_ENDEDIT でのみテストする必要がある場合、スピードはどの程度重要なのでしょうか?
いずれにせよ、OPは今、多くのことを行っていると確信しています。
または正規表現を 使用する :-D
ゼロを "0 "と入力し、それ以外を拒否するように要求することもできます。あるいは正規表現を使う :-D
個人的には、次のようなアプローチを取ります。
ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御 したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。
例
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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);
}
}
個人的には、次のようなアプローチを取ります。
ENDEDITが発生したら、OBJ_TEXTを doubleにキャストして、それを文字列としてエディットボックスに戻す(フォーマットを制御したい場合はStringFormat()を使用する)。ユーザーは自分の行動の結果をすぐに見ることができ、それが自分のニーズに合っていない場合は変更するか、そのままにしておくことができます。
例
#define EDIT_BOX "EditBox"
int OnInit()
{
ObjectCreate (0, EDIT_BOX, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YDISTANCE, 200);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_XSIZE, 100);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, EDIT_BOX, OBJPROP_ALIGN, ALIGN_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
入力内容を検証する方法が必要です。(追加のボタン ?)
よくわからないのですが......?
OPの意図を誤解しているかもしれませんが、インターフェイスは動的なものであると思います。
検証ボタンがあってもいいのですが、結果が単に表示されるだけなら(アクションを起こすのではなく)、不要な追加かもしれません。しかし、私はよくわかりません。OPは明確にする必要があります。
シンプルにしましょう。とにかく、お好きなように:p
物事をシンプルに保つことにとても同意します。これ以上シンプルにすることはないでしょう?
ObjectSetString(0, EDIT_BOX, OBJPROP_TEXT, (string)value);
PS 私の希望通りかどうかは分かりませんが、私にとっては単なる学術的な議論に過ぎません。
よくわからないのですが......?
...もし、一般的な要望として「変数の中身が数値かどうかを調べるには どうしたらいいか」 と考えるなら、最もエレガントな解決策は正規表現を使うことです。