【MQL5】StringCompare関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

StringCompare関数の働き・役割

StringCompare関数は、2つの文字列を比較し、その比較結果を整数値で返します。

この関数を使用することで、文字列の大小関係や等価性(同じものかどうか)を調べることができます。

文字列の大小関係や等価性の比較方法

文字列の比較は、アルファベット順に一文字ずつ行われます。各文字は、対応するASCIIまたはUnicodeのコード値に基づいて比較されます。

Unicodeについての詳細は↓の記事をご参照ください

この比較は以下のように行われます:

  1. 最初の文字を比較します。
  2. 最初の文字が同じであれば、次の文字を比較します。
  3. 一つの文字がもう一方の文字よりも小さい(例えば’A’ < ‘B’)場合、その文字列全体も小さいと見なされます。
  4. 全ての文字が同じであれば、文字列全体が等しいと見なされます。

日本語の場合はどうなるの?

日本語の文字列を比較する場合も、基本的な原理は同じです。

文字列の各文字はUnicode値に基づいて比較されます。例えば、「あ」と「い」を比較すると、「あ」のUnicode値が「い」よりも小さいため、「あ」は「い」よりも小さいと判断されます。日本語の文字列比較でも、大文字小文字の区別が必要な場合がありますが、日本語では通常ひらがな、カタカナ、漢字の違いが比較対象となります。

StringCompare関数の引数について

int StringCompare(
   const string& string1,       // 比較対象の最初の文字列
   const string& string2,       // 比較対象の二つ目の文字列
   bool case_sensitive=true     // 大文字と小文字を区別するかどうか
);

StringCompare関数は以下の引数を取ります:

  • string1:比較対象の最初の文字列
  • string2:比較対象の二つ目の文字列
  • case_sensitive:大文字と小文字を区別するかどうかを指定するbool型の値。
    この値がtrueの場合、大文字と小文字が区別されます。falseの場合、区別されません。デフォルト値はtrueです。

StringCompare関数の戻り値について

StringCompare関数戻り値は以下の通りです:

  • -1:string1string2より小さい場合。
  • 0:string1string2と等しい場合。
  • 1:string1string2より大きい場合。

StringCompare関数を使う際の注意点

  • 文字列の比較はアルファベット順に行われ、現在のコードページに従います。
    コードページとは、文字セットの特定のエンコーディング(文字をデジタルデータとして表現する方法)を指し、例えば、UTF-8やShift_JISなどがあります。
    つまり、文字列の各文字がアルファベット順(またはUnicode順)で一文字ずつ比較され、その順序は使用しているシステムのコードページ(文字エンコーディング)に基づきます。
    例えば、英語のアルファベットの場合、’A’から’Z’までの順序で比較されます。また、比較する文字の順序はASCIIコードまたはUnicodeに基づきます。
    日本語の場合も同様に、文字はUnicode順に基づいて比較されます。これにより、ひらがな、カタカナ、漢字の間で正しい順序が保たれます。例えば、「あ」は「い」よりもUnicode値が小さいため、”あいう”は”かきく”より小さいと判断されます。
  • 大文字と小文字を区別するかどうかは、case_sensitiveパラメータで制御できます。デフォルトでは、大文字と小文字が区別されます。

StringCompare関数を使ったサンプルコード

以下は、StringCompare関数を使って文字列を比較するサンプルコードです。

// スクリプトの実行開始時に自動的に呼び出されるOnStart関数
void OnStart()
{
    // 比較対象の文字列を定義
    string s1 = "Apple";
    string s2 = "home";
    
    // 大文字小文字を区別して比較
    int result1 = StringCompare(s1, s2);
    if(result1 > 0)
        PrintFormat("大文字小文字を区別した比較: %s > %s", s1, s2);
    else if(result1 < 0)
        PrintFormat("大文字小文字を区別した比較: %s < %s", s1, s2);
    else
        PrintFormat("大文字小文字を区別した比較: %s = %s", s1, s2);
    
    // 大文字小文字を区別せずに比較
    int result2 = StringCompare(s1, s2, false);
    if(result2 > 0)
        PrintFormat("大文字小文字を区別しない比較: %s > %s", s1, s2);
    else if(result2 < 0)
        PrintFormat("大文字小文字を区別しない比較: %s < %s", s1, s2);
    else
        PrintFormat("大文字小文字を区別しない比較: %s = %s", s1, s2);
    
    // 日本語の比較
    string s3 = "あいう";
    string s4 = "かきく";
    
    // 日本語文字列の比較
    int result3 = StringCompare(s3, s4);
    if(result3 > 0)
        PrintFormat("日本語の比較: %s > %s", s3, s4);
    else if(result3 < 0)
        PrintFormat("日本語の比較: %s < %s", s3, s4);
    else
        PrintFormat("日本語の比較: %s = %s", s3, s4);
}

サンプルコードに使われた関数や文法要素の簡単な解説

このサンプルコードでは、”Apple”と”home”、および日本語の”あいう”と”かきく”という2つの文字列を比較しています。

まず、大文字と小文字を区別して比較し、その結果をエキスパートログに出力します。

次に、大文字と小文字を区別せずに比較し、その結果もエキスパートログに出力します。また、日本語の文字列も比較し、その結果をエキスパートログに出力します​

<参照>

StringAdd関数/StringBufferLen関数/StringLen関数/StringConcatenate関数/StringFill関数/StringInit関数/StringFind関数/StringGetCharacter関数/StringSetLength関数/StringReplace関数/StringReserve関数/StringSetCharacter関数/StringSplit関数/StringSubstr関数/StringToLower関数/StringToUpper関数/StringTrimLeft関数/StringTrimRight関数

コメント

タイトルとURLをコピーしました