[MQL] 文字列が数値かどうか判定する方法
MQLで文字列が数値かどうか判定する処理方法を紹介します。
標準関数はない
MQLでは文字列が数値かどうか判定する関数は残念ながら用意されていません。
ですので、そのような判定をしたい場合には、自身で処理を作る必要があります。
文字コードを使った判定方法
文字列が数値かどうか判定する方法として、MQL5.comのForumに参考になりそうな書込みがあります。
MQL5.com『How to do “IsNumber”?』
↑この書込にある処理は、文字列を1文字づつStringGetCharacter()
関数で文字コードに変換して数値またはピリオドかどうかをチェックしています。
さてこの方法はスマートで良いのですが、「文字コードっていまいちよくわからない。」という方もいると思います。
そこで以下では、もう少し直感的に理解しやすい処理方法を紹介します。ただしあまりカッコよくはないです。
文字そのもので判定する方法
下記は、引数strが正の数値かどうかを判定する関数です。
//+------------------------------------------------------------------+
//| Function: is number |
//+------------------------------------------------------------------+
bool IsNumber(string str){
//文字数が0文字ならfalse
if(StringLen(str) == 0) return false;
//1文字づつ数値かどうか判定する
int p_count = 0; //ピリオドのカウント用
for(int i = 0; i <= StringLen(str) - 1; i++){
string s = StringSubstr(str, i, 1);
if(s == "0") continue;
if(s == "1") continue;
if(s == "2") continue;
if(s == "3") continue;
if(s == "4") continue;
if(s == "5") continue;
if(s == "6") continue;
if(s == "7") continue;
if(s == "8") continue;
if(s == "9") continue;
if(s == ".") {p_count++; continue;}
//上記に該当しなければfalse
return false;
}
//ピリオドが2回以上出現していたらfalse
if(p_count > 1) return false;
//ここまで到達できたらtrue
return true;
}
上記のコードでは、StringSubStr()
関数を使って文字列を1文字づつ抽出し、0~9またはピリオド「.」であるかを(文字コードに変換せずに)文字そのもので判定しています。またピリオドが2回以上出現していないかどうかも最後に判定しています。これらの判定を全てパスできたら正の数値と判定しtrueを返すという方法です。
スマートさはありませんが、理解しやすいかなと思います。
補足:負の値の場合は?
上記コードは正の数値の判定ですが、負の数値も判定したい場合には、for()
の部分で最初の1文字目だけマイナス記号-
かどうかを判定に加えればOKです。
まとめ
MQLで文字列が数値かどうかを判定するコードの書き方を紹介しました。
使いどころとしては、ユーザーの入力した文字列が価格かどうかを判定するときなどでしょうか。
それでは。
正数の場合StringToIntegerで文字列を数値に変換,(string)で文字列に戻したものと元の変数を比較してはいかがでしょうか
string txt="1";
if(txt==(string)StringToInteger(txt))Comment("Number");
else Comment("Not Number");
TACA / AMSERさんへ
コメントありがとうございます。数値かどうか判断するやり方はいろいろですね。コメント頂いたやり方は入力値が整数ならばシンプルに書けるのでアリだと思います。少数の場合やゼロの場合も判定に含めるならば少し回避手段がいるかもしれませんです。