値チェックモジュール - git0331-lgtm/Knowledge GitHub Wiki

### 値チェックモジュール
    public class ValueChecker
    {
        public enum CheckResult
        {
            Null,
            NotNull,

            Empty,
            NotEmpty,

            WhiteSpace,
            NotWhiteSpace,

            NotNullAndEmptyAndWhiteSpace,

            Contains,
            NotContain,
            NotAllContain,

            ValidFormat,
            InvalidFormat,

            InRange,
            OutOfRange,

            ValidType,
            InvalidType,

            FailedCast,
        }

        /// <summary>
        /// 指定されたオブジェクトが null かどうかを判定
        /// </summary>
        /// <typeparam name="T">チェックするオブジェクトの型</typeparam>
        /// <param name="obj">チェック対象のオブジェクト</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsNull<T>(T obj)
        {
            return obj == null ? CheckResult.Null : CheckResult.NotNull;
        }

        /// <summary>
        /// 指定された文字列が空文字かどうかを判定
        /// </summary>
        /// <param name="str">チェック対象の文字列</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsEmpty(string str)
        {
            return str == null ? CheckResult.Null : str.Length == 0 ? CheckResult.Empty : CheckResult.NotEmpty;
        }

        /// <summary>
        /// 指定された文字列が空白文字かどうかを判定
        /// </summary>
        /// <param name="str">チェック対象の文字列</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsWhiteSpace(string str)
        {
            return str == null ? CheckResult.Null : string.IsNullOrWhiteSpace(str) ? CheckResult.WhiteSpace : CheckResult.NotWhiteSpace;
        }

        /// <summary>
        /// 指定された文字列が null または 空文字 または 空白文字かどうかを判定
        /// 全てに当てはまらない場合は NotNullAndEmptyAndWhiteSpace を返す
        /// </summary>
        /// <param name="str">チェック対象の文字列</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsNullOrEmptyOrWhiteSpace(string str)
        {
            if (str == null) return CheckResult.Null;
            if (str.Length == 0) return CheckResult.Empty;
            return string.IsNullOrWhiteSpace(str) ? CheckResult.WhiteSpace : CheckResult.NotNullAndEmptyAndWhiteSpace;
        }

        /// <summary>
        /// 指定された値に指定した値が含まれているかどうかを判定
        /// </summary>
        /// <typeparam name="T">チェックに指定する値の型</typeparam>
        /// <param name="str">チェック対象の文字列</param>
        /// <param name="valueToCheck">チェックに指定する値</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckContainsSpecifiedValue<T>(object str, T valueToCheck)
        {
            if (str == null) return CheckResult.Null;
            if (valueToCheck == null) return CheckResult.Null;

            if (!(str is string strValue || str is IConvertible)) return CheckResult.InvalidType;
            strValue = str.ToString();

            return strValue.Contains(valueToCheck.ToString()) ? CheckResult.Contains : CheckResult.NotContain;
        }

        /// <summary>
        /// 指定された値に指定した値のいずれか含まれているか または すべて含まれているかを判定
        /// </summary>
        /// <typeparam name="T">チェックに指定する配列の型</typeparam>
        /// <param name="type">判定の種類 ("ANY" または "ALL")</param>
        /// <param name="str">チェック対象の文字列</param>
        /// <param name="valuesToCheck">チェックする値の配列</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckContainsAnyOrAllSpecifiedValues<T>(string type, object str, params T[] valuesToCheck)
        {
            type = type.ToUpper();

            if (str == null) return CheckResult.Null;
            if (!(str is string strValue || str is IConvertible)) return CheckResult.InvalidType;
            strValue = str.ToString();

            if (valuesToCheck == null) return CheckResult.Null;
            if (valuesToCheck.Length == 0) return CheckResult.Empty;

            for (int i = 0; i < valuesToCheck.Length; i++)
            {
                if (valuesToCheck[i] == null) return CheckResult.InvalidType;
            }

            if (type == "ALL")
            {
                return valuesToCheck.All(value => strValue.Contains(value.ToString()))
                    ? CheckResult.Contains
                    : CheckResult.NotAllContain;
            }
            else if (type == "ANY")
            {
                return valuesToCheck.Any(value => strValue.Contains(value.ToString()))
                    ? CheckResult.Contains
                    : CheckResult.NotContain;
            }
            else
            {
                return CheckResult.InvalidType;
            }
        }

        /// <summary>
        /// 指定された文字列が特定のフォーマットに一致するかどうかを判定
        /// </summary>
        /// <param name="value">チェック対象の文字列</param>
        /// <param name="pattern">正規表現パターン</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsValidFormat(object value, string pattern)
        {
            if (value == null) return CheckResult.Null;
            if (!(value is string strValue || value is IConvertible)) return CheckResult.InvalidType;
            strValue = value.ToString();

            return Regex.IsMatch(strValue, pattern) ? CheckResult.ValidFormat : CheckResult.InvalidFormat;
        }

        /// <summary>
        /// 指定された数値が指定された範囲内かどうかを判定
        /// </summary>
        /// <typeparam name="T">チェックする数値の型</typeparam>
        /// <param name="value">チェック対象の数値</param>
        /// <param name="min">範囲の最小値</param>
        /// <param name="max">範囲の最大値</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsInRange<T>(T value, decimal min, decimal max) where T : struct, IConvertible
        {
            try
            {
                decimal numericValue = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
                return numericValue >= min && numericValue <= max ? CheckResult.InRange : CheckResult.OutOfRange;
            }
            catch (InvalidCastException)
            {
                return CheckResult.FailedCast;
            }
            catch (FormatException)
            {
                return CheckResult.InvalidFormat;
            }
        }

        /// <summary>
        /// 指定されたオブジェクトが指定された型かどうかを確認
        /// </summary>
        /// <typeparam name="T">チェックする型</typeparam>
        /// <param name="input">チェック対象のオブジェクト</param>
        /// <returns>チェック結果</returns>
        public static CheckResult CheckIsOfType<T>(object input)
        {
            if (input == null) return CheckResult.Null;
            return input is T ? CheckResult.ValidType : CheckResult.InvalidType;
        }

        /// <summary>
        /// 指定された文字列内の全角数字を半角数字に変換
        /// </summary>
        /// <param name="input">チェック対象の文字列</param>
        /// <returns>変換後文字列</returns>
        public static string ConvertFullWidthToHalfWidth(string input)
        {
            if (input == null) return null;

            // 全角数字を半角数字に変換
            return input.Replace('0', '0')
                        .Replace('1', '1')
                        .Replace('2', '2')
                        .Replace('3', '3')
                        .Replace('4', '4')
                        .Replace('5', '5')
                        .Replace('6', '6')
                        .Replace('7', '7')
                        .Replace('8', '8')
                        .Replace('9', '9');
        }
    }
⚠️ **GitHub.com Fallback** ⚠️