AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【Unity】英数文字列を半角全角、大文字小文字区別なく比較する方法

最近、Unityでテキストを入力してもらって答えの判定を行うアプリを作ったんですが、
英数字が答えの場合、半角で入力された場合と全角で入力された場合、小文字で入力された場合、大文字で入力された場合で文字列が異なるため、
正しい答えのはずなのに不正解になってしまうという現象が発生しました。
半角、全角、大文字・小文字の全パターンで答えを用意してもいいですが、答えをたくさん用意する必要があったので、
今後のために「英数文字列を半角全角、大文字小文字区別なく比較する方法」を考えてみました。
ネットを調べた感じだと、半角・全角のみや、大文字小文字のみの比較は結構あるのですが、それらの合体版はなかったので作りました。
ちなみに、今回のものは英数のみに対応しており、カタカナは非対応です。



【Unity】英数文字列を半角全角、大文字小文字区別なく比較する方法

using System.Text.RegularExpressions;

//第一引数:入力する値
//第二引数:比較対象の値
private bool Test(string input,string v)
{
        bool isAlphabetOnly = !Regex.IsMatch(input, @"[^a-zA-z]");//アルファベットかの判定
        bool isNumberOnly = !Regex.IsMatch(input, @"[^0-9]");//数字かの判定
        if (isAlphabetOnly || isNumberOnly)
        {
            if (isAlphabetOnly)
            {
                string upper = input.ToUpper();
                string lower = input.ToLower();
                //大文字小文字の比較
                int result0 = string.Compare(upper, v, true);
                int result1 = string.Compare(lower, v, true);
                if (result0 == 0 || result1 == 0)
                {
                    return true;
                }
                //半角全角の比較
                var ci = System.Globalization.CultureInfo.CurrentCulture.CompareInfo;
                int result00 = ci.Compare(upper, v, System.Globalization.CompareOptions.IgnoreWidth);
                int result11 = ci.Compare(lower, v, System.Globalization.CompareOptions.IgnoreWidth);
                if (result00 == 0 || result11 == 0)
                {
                    return true;
                }
            }
            else
            {
                //半角全角の比較
                var ci = System.Globalization.CultureInfo.CurrentCulture.CompareInfo;
                int result = ci.Compare(input, v, System.Globalization.CompareOptions.IgnoreWidth);
                if (result == 0)
                {
                    return true;
                }
            }
            return false;
        }
        else
        {
            return false;
        }
}