trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

数字およびアルファベットを半角から全角へ、またはその逆の変換を行う

以下のサンプルコードで使用している変換の考え方は、ネット上でいくつか見かけて参考にさせていただいたのですが、それをRegex.Replaceとラムダ式を使って簡潔に書いてみました。
ついでにstringの拡張メソッドとして定義しています。
ちなみに以下で使用している変換の考え方というのは、文字コード上、0から9、0から9、aからz、aからz、AからZ、AからZはそれぞれ連続していますので、それぞれのグループの最初の一文字から変換する一文字との差分は、半角と全角で同じであることを利用しています。
例えば、3であれば0からの差分と3の0からの差分は同じですから、3を3に変換する場合は、3の0からの差分を、0に足せば3になります。

    static class 拡張メソッド
    {

        /// <summary>
        /// 半角数字を全角数字に変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string HanToZenNum(this string s)
        {
            return Regex.Replace(s, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());
        }

        /// <summary>
        /// 全角数字を半角数字に変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string ZenToHanNum(this string s)
        {
            return Regex.Replace(s, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());
        }

        /// <summary>
        /// 半角アルファベットを全角アルファベットに変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string HanToZenAlpha(this string s)
        {
            var str = Regex.Replace(s, "[a-z]", p => ((char)(p.Value[0] - 'a' + 'a')).ToString());

            return Regex.Replace(str, "[A-Z]", p => ((char)(p.Value[0] - 'A' + 'A')).ToString());
        }

        /// <summary>
        /// 全角アルファベットを半角アルファベットに変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string ZenToHanAlpha(this string s)
        {
            var str = Regex.Replace(s, "[a-z]", p => ((char)(p.Value[0] - 'a' + 'a')).ToString());

            return Regex.Replace(str, "[A-Z]", p => ((char)(p.Value[0] - 'A' + 'A')).ToString());
        }

    }