C#を始めよう|日付の妥当性をチェック

プログラムでエンドユーザーに日付の入力を求めたとしましょう。
ユーザーはどんな入力をするか!?プログラム的に適切な入力をする保証は全くありません。

入力を制限する方法もありますが、限界があるので日付が妥当かチェックする仕組みを組み立てます。

日付の妥当性をチェックするプログラム

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SampleProjects
{
    class Sample
    {
        static void Main(string[] args)
        {
            string strdate = "20200231";
            bool rtn;

            GlobalVariable GlobalVariable = new GlobalVariable();
            DateTimeCheck DateTimeCheck = new DateTimeCheck();

            Console.WriteLine(strdate);

            rtn = DateTimeCheck.dateJudgment(strdate);

            if( rtn == GlobalVariable.OK)
                Console.WriteLine("日付は妥当です。");
            else
                Console.WriteLine("日付が妥当でありません。");

            Console.ReadLine();
        }
    }
}

こんなコードを書きました。

簡単に説明するとstrdate変数に文字列で日付を代入します。
呼び出した関数の戻り値を代入するrtn変数をboll型で宣言します。

定数を定義したクラスと日付の妥当性をチェックするクラスをインスタンス化します。

dateJudgmentメソッドの戻り値によってコンソール出力します。

それでは各クラスの内容を見てみます。

定数を定義したクラス

class GlobalVariable
{
    public bool OK { get; set; }
    public bool NG { get; set; }

    public GlobalVariable()
    {
        OK = true;
        NG = false;
    }
}

今回は少ない定数ですが必要に応じてこのクラスに追加します。

日付の妥当性をチェックするクラス

using System;

class DateTimeCheck
{
    GlobalVariable GlobalVariable = new GlobalVariable();
    NumericCheck NumericCheck = new NumericCheck();

    //  文字列が日付として妥当か判断する(yyyymmdd)
    public bool dateJudgment(string date)
    {
        DateTime datetimevalue;
        string strdate;

        if (date.Length != 8)
            return GlobalVariable.NG;

        if( NumericCheck.NumericJudgment(date)   == GlobalVariable.NG)
            return GlobalVariable.NG;

        strdate = date.Substring(0, 4) + "/"    +   date.Substring(4, 2) + "/"  +   date.Substring(6, 2);

        return DateTime.TryParse(strdate, out datetimevalue);
    }
}

ここでも定数を定義したクラス、GlobalVariableをインスタンス化しています。
他に引数(文字列の日付)が数値か否かをチェックするクラス、NumericCheckをインスタンス化します。

dateJudgmentメソッドは引数が8文字であること、更に数値であることDateTime型に正しく変換できるかをチェックしてその結果を戻り値として返しています。

NumericCheckクラスを見ます。

文字列が数値で構成されているかチェック

class NumericCheck
{
    //  文字列が数値か判定する
    public  bool    NumericJudgment(string numeric)
    {
        int num;
        GlobalVariable GlobalVariable = new GlobalVariable();

        return int.TryParse(numeric, out num);
    }
}

引数(文字列の日付)をint型に正しく変換できるかをチェックして結果を戻り値として返します。

コメント