Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【.NET】指定された文字数の文字列を文字列の左端から取得する拡張メソッド

指定された文字数の文字列を文字列の左端から取得する拡張メソッドLeftです。


前回作成したRightも、リファクタリングして再掲します。

拡張メソッド定義

using System;

namespace Extensions {
    static class StringExtensions {

        /// <summary>
        /// 指定された文字数の文字列を文字列の右端から取得します。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <param name="length">取り出す文字列の文字数。</param>
        /// <returns>取り出した文字列。</returns>
        public static string Right(this string self, int length) {
            if (NeedsTruncateChars(self, length) == false)
                return self;

            return self.Substring(self.Length - length, length);
        }

        /// <summary>
        /// 指定された文字数の文字列を文字列の左端から取得します。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <param name="length">取り出す文字列の文字数。</param>
        /// <returns>取り出した文字列。</returns>
        public static string Left(this string self, int length) {
            if (NeedsTruncateChars(self, length) == false)
                return self;

            return self.Substring(0, length);
        }

        /// <summary>
        /// 文字列の削除が必要かどうかを示す値を取得します。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <param name="length">取り出す文字列の文字数。</param>
        /// <returns>文字列の削除が必要な場合はtrue。不要な場合はfalse。</returns>
        private static bool NeedsTruncateChars(string self, int length) {
            if (length < 0)
                throw new ArgumentException("桁数には負数を指定できません。", nameof(length));

            if (string.IsNullOrEmpty(self))
                return false;

            if (self.Length <= length)
                return false;

            return true;
        }
    }
}

テスト

using System;

namespace Extensions {
    class Program {
        static void Main(string[] args) {
            string hoge1 = "abc";
            Console.WriteLine(hoge1.Left(0));  // 出力なし
            Console.WriteLine(hoge1.Left(1));  // a
            Console.WriteLine(hoge1.Left(2));  // ab
            Console.WriteLine(hoge1.Left(3));  // abc
            Console.WriteLine(hoge1.Left(4));  // abc

            try {
                Console.WriteLine(hoge1.Left(-1));
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);  // 桁数には負数を指定できません。パラメーター名:length
            }

            string hoge2 = "";
            Console.WriteLine(hoge2.Left(0));  // 出力なし
            Console.WriteLine(hoge2.Left(1));  // 出力なし

            string hoge3 = null;
            Console.WriteLine(hoge3.Left(0));  // 出力なし
            Console.WriteLine(hoge3.Left(1));  // 出力なし

            Console.ReadKey();
        }
    }
}