C# 数値の入力チェック

C# サンプルコード プログラミング

概要説明 

テキストボックスに入力された数値が正しいかチェックするサンプルです。

サンプルとして、isNumberメソッド、isNumberFromToメソッドを作成しました。

isNumberメソッドは数値チェックを行いエラーがあればErrorProviderに警告を通知します。

isNumberFromToメソッドは開始と終了の大小関係をチェックします。

こちらもエラーがあればErrorProviderに警告を通知します。

入力チェックの内容

数値チェック

・必須チェック

 必須指定の場合、未入力なら警告を通知します。

・数値チェック

 数値に変換できない場合、警告を通知します。

数値チェック(isNumber)の引数
No引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string項目名警告時に表示する項目名
3TextBoxテキストボックスチェック対象のテキストボックス
4bool必須区分true:必須 false:必須でない
5int少数以下桁数許す小数点以下の桁数
6double最小値許す最小値
7double最大値許す最大値

数値大小関係チェック

・数値大小関係チェック

 終了値が開始値より小さいなら警告を通知します。

数値大小関係チェック(isNumberFromTo)の引数
No引数内容
1ErrorProviderErrorProvider警告時に通知するErrorProvider
2string開始値の項目名警告時に表示する項目名
3string終了値の項目名警告時に表示する項目名
4TextBox開始値チェック対象のテキストボックス
5TextBox終了値チェック対象のテキストボックス

サンプルの内容

①~③のチェックを行い、エラーがあれば警告の通知をメソッド内で行います。

正常であればtrue、エラーならfalseを返します。

① 必須チェックをする

 IsNullOrEmptyを使用してnullか空の文字列かを判定しています。

② 数値チェック

 TryParseを使用して数値に変換できるか判定しています。

③ 範囲チェック

 引数の最小値~最大値の範囲内か判定しています。

④ 小数点以下の桁数チェック

 引数の少数以下桁数と「.」から右の文字数で判定しています。

⑤ 数値大小関係チェック

 開始値と終了値をdoubleに変換し大小判定しています。

 開始値と終了値の何れかが、nullか空文字の場合はチェックを行わずtrueを返します。

 また、開始値と終了値の値にエラーがないことを判定してから呼び出しています。

使用部品

No項目名Textname部品
1コイン所有枚数(見出し)コイン所有枚数label1Label
2コイン所有枚数(入力欄)txtNumberTextBox
3コイン購入予定数(見出し)有効期間label2Label
4コイン購入予定数・開始(入力欄)txtNumberFromTextBox
5コイン購入予定数・終了(入力欄)txtNumberToTextBox
6チェックボタンチェックbutton1Button

プログラミング

言語:C#

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

namespace WindowsFormsApp20
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // ErrorProviderのインスタンス生成
        ErrorProvider ep = new ErrorProvider();

        // 画面起動時処理
        private void Form1_Load(object sender, EventArgs e)
        {
            // ErrorProviderのアイコンを点滅なしに設定する
            ep.BlinkStyle = ErrorBlinkStyle.NeverBlink;
        }

        /// <summary>
        /// チェックボタンクリック処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // エラーフラグ
            bool errFlg = false;

            // ErrorProviderをクリアします。
            ep.Clear();

            // コイン所有枚数の数値チェック
            if (!isNumber(ep, "コイン所有枚数", txtNumber, true, 0, 0, 100)) {
                errFlg = true;
            }

            // コイン購入予定数(開始)の数値チェック
            if (!isNumber(ep, "コイン購入予定数(開始)", txtNumberFrom, false, 2, 0, 100.99))
            {
                errFlg = true;
            }

            // コイン購入予定数(終了)の数値チェック
            if (!isNumber(ep, "コイン購入予定数(終了)", txtNumberTo, false, 2, 0, 100.99))
            {
                errFlg = true;
            }

            //  コイン購入予定数の大小関係チェック
            if (!errFlg)
            {
                isNumberFromTo(ep, "コイン購入予定数(開始)", "コイン購入予定数(終了)",
                               txtNumberFrom, txtNumberTo);
            }
        }


        /// <summary>
        /// 数値チェック
        /// </summary>
        /// <param name="ep">ErrorProvider</param>
        /// <param name="itemName">項目名</param>
        /// <param name="c">TextBox</param>
        /// <param name="required">必須区分(true:必須 false:必須でない)</param>
        /// <param name="pointNum">少数以下桁数</param>
        /// <param name="minValue">最小値</param>
        /// <param name="maxValue">最大値</param>
        /// <returns>結果</returns>
        static bool isNumber(ErrorProvider ep, string itemName, TextBox c, bool required,
                             int pointNum,double minValue, double maxValue)
        {
            string msg = "";

            // nullか空の文字列か判定する
            if (String.IsNullOrEmpty(c.Text))
            {
                // 必須チェックを行うか判定する
                if (required)
                {
                    // 未入力の警告を通知する。
                    msg = $"{itemName} は、必須項目です。";
                    ep.SetError(c, msg);

                    // CHECK NG
                    return false;
                }
                else
                {
                    // CHECK OK
                    return true;
                }
            }

            // 数値チェック
            double d;
            if (!double.TryParse(c.Text, out d))
            {
                // 数値でない警告を通知する
                msg = $"{itemName} は、数値ではありません。";
                ep.SetError(c, msg);

                // CHECK NG
                return false;
            }

            // 範囲チェック
            if (d < minValue || d > maxValue) {


                // 範囲外の警告を通知する
                msg = $"{itemName} は、{minValue} ~ {maxValue} の範囲内で入力して下さい。";
                ep.SetError(c, msg);

                // CHECK NG
                return false;
            }

            // ピリオドの位置を取得する
            int period = d.ToString().IndexOf(".");
            if (period == -1)
            {
                // CHECK OK (ピリオドなし)
                return true;
            }

            // 小数点以下の桁数チェック
            int digit = d.ToString().Substring(period+1).Length;
            if (pointNum < digit)
            {
                if ( pointNum == 0)
                {
                    msg = $"{itemName} は、整数で入力して下さい。";
                }
                else
                {
                    msg = $"{itemName} は、小数点以下の桁数を{pointNum}桁で入力して下さい。";
                }
                ep.SetError(c, msg);

                // CHECK NG
                return false;
            }

            // CHECK OK
            return true;
        }

        /// <summary>
        /// 大小関係チェック
        /// </summary>
        /// <param name="ep">ErrorProvider</param>
        /// <param name="itemName1">開始値の項目名</param>
        /// <param name="itemName2">終了値の項目名</param>
        /// <param name="c1">開始値</param>
        /// <param name="c2">終了値</param>
        /// <returns>結果</returns>
        static bool isNumberFromTo(ErrorProvider ep, string itemName1, string itemName2,
                                   TextBox c1, TextBox c2)
        {
            string msg = "";

            // 開始値と終了値のどちらかが、null又は空文字か判定する
            if (String.IsNullOrEmpty(c1.Text) || String.IsNullOrEmpty(c2.Text))
            {
                // CHECK OK
                return true;
            }

            // 数値に変換する
            double d1 = double.Parse(c1.Text);
            double d2 = double.Parse(c2.Text);

            // 終了日が開始日より前か判定する
            if (d2 < d1)
            {
                // 終了値が開始値より前の警告を通知する
                msg = $"{itemName2} が、{itemName1} より小さい値です。";

                // 終了日の警告をセット
                ep.SetError(c2, msg);

                // CHECK NG
                return false;
            }

            // CHECK OK
            return true;
        }
    }
}

実行結果

コイン所有枚数:必須チェックの警告が通知されます。

コイン所有枚数:数値でない警告が通知されます。

コイン所有枚数:日付でない警告が通知されます。

コイン購入予定:終了値が開始値より小さい警告が通知されます。

コイン所有枚数:範囲外の警告が通知されます。

コイン購入予定:小数点以下の桁数超えの警告が通知されます。

開始値と終了値のどちらかが未入力の場合には大小関係チェックは行いませんので、警告は通知されません。

以上です。

コメント

タイトルとURLをコピーしました