いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

全角と半角の違いを無視して文字列比較 (string.Compare, CultureInfo, CompareInfo, CompareOptions, IgnoreWidth)


知ってると、ちょっと便利かもしれないTips。メモメモ。


前回の記事で、CompareOptions.IgnoreKanaTypeのケースを記述しているので、こちらもご参照ください。


System.Stringには、静的なCompareメソッドが存在しますが
このメソッドには、いくつかのオーバーロードが存在します。


そのうちの一つに、CultureInfoとCompareOptionsを引数にとるオーバーロード
があり、指定するCompareOptionsの値によって、いろいろな比較方法を指定できます。


で、このCompareOptionsには

CompareOptions.IgnoreWidth

という値があり、これを指定すると

全角と半角の違いを無視して文字列比較

が行われます。
また、複数の条件を結合する場合はORで結合できます。
なので、

(CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth)

とすると、

ひらがなとカタカナの違いを無視し、且つ、全角と半角の違いを無視して文字列比較

となります。


以下、サンプルです。

  using System.Globalization;

  #region CompareOptionsSamples-02
  /// <summary>
  /// CompareOptions列挙型のサンプルです。
  /// </summary>
  public class CompareOptionsSamples02 : IExecutable
  {
    public void Execute()
    {
      //
      // string.Compareメソッドには、CultureInfoとCompareOptionsを
      // 引数にとるオーバーロードが定義されている。(他にもオーバーロードメソッドが存在します。)
      //
      // このオーバーロードを利用する際、CompareOptions.IgnoreKanaTypeを指定すると
      // 「ひらがな」と「カタカナ」の違いを無視して、文字列比較を行う事が出来る。
      //
      // さらに、CompareOptionsには、IgnoreWidthという値も存在し
      // これを指定すると、全角と半角の違いを無視して、文字列比較を行う事が出来る。
      //
      string ja1 = "ハローワールド";
      string ja2 = "ハローワールド";
      string ja3 = "はろーわーるど";
      
      CultureInfo ci = new CultureInfo("ja-JP");
      
      // 全角半角の違いを無視して、「ハローワールド」と「ハローワールド」を比較
      Console.WriteLine("{0}", string.Compare(ja1, ja2, ci, CompareOptions.IgnoreWidth).ToStringResult());
      // 全角半角の違いを無視して、「はろーわーるど」と「ハローワールド」を比較
      Console.WriteLine("{0}", string.Compare(ja3, ja2, ci, CompareOptions.IgnoreWidth).ToStringResult());
      // 全角半角の違いを無視し、且つ、ひらがなとカタカナの違いを無視して、「はろーわーるど」と「ハローワールド」を比較
      Console.WriteLine("{0}", string.Compare(ja3, ja2, ci, (CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType)).ToStringResult());
    }
  }
  #endregion

上記のサンプルでは、「はろーわーるど」と「ハローワールド」と「ハローワールド」の3つの文字列をstring.Compareメソッドで比較しています。


結果は、以下のようになります。

  等しい
  大きい
  等しい

IgnoreWidthを指定した場合、同じ文字列として判定されています。



================================
過去の記事については、以下のページからご参照下さい。