Back to Top

プログラムの覚書

Category: C#

.NET C#

C# 特定文の文字列かを判断する

C#にてGUIアプリケーションを作成するときに使用する

TextBox など入力文字の制限をする場合に使用する。特定文の文字列(整数・実数・全角かな・TELなど)かを判断する方法例を説明します。

 

特定の文字列に含まれる文字の判断

単純な文字列は、foreach等で文字列中の文字を1文字づつ取り出し、特定の文字か比較して判断出来ます。(プログラムの基本的な方法です。)

IsHalfNumeric等は特定の文字か判断を参照してください。)

//半角数字の文字列か判断する
static public bool IsHalfNumericStr(string s)
{
    bool rc = true;

    foreach (char c in s)
    {
        if (!IsHalfNumeric(c))
        {
            rc = false;
            break;
        }
    }

    return (rc);
}

//半角整数値の文字列か判断する
static public bool IsHalfDigitStr(string s)
{
    bool rc = true;

    foreach (char c in s)
    {
        if (!IsHalfDigit(c))
        {
            rc = false;
            break;
        }
    }

    return (rc);
}

//半角実数値の文字列か判断する
static public bool IsHalfRealStr(string s)
{
}

//半角16進数の文字列か判断する
static public bool IsHalfHexStr(string s)
{
}

//半角英文字の文字列か判断する
static public bool IsHalfAlphaStr(string s)
{
}

//半角英数字の文字列か判断する
static public bool IsHalfAlnumStr(string s)
{
}

//半角カナ文字の文字列か判断する
static public bool IsHalfKanaStr(string s)
{
}

//半角表示文字の文字列か判断する
static public bool IsHalfDisplayStr(string s)
{
}

※実数判断を厳密にするには、以下のような正規表現にて行ってください。

 

正規表現での特定文字列の判断

単純な文字列とは違い、日付・電話番号・郵便番号などは単純な比較では出来ませんので、正規表現にて判断します。以下に判断方法の例を記載します。

特定文字列か判断する関数 _IsMatchString() 関数を作成します。(この関数は単に汎用性を持たせるためです)

作成した正規表現と判断する文字列を _IsMatchString() に渡すだけです。

static private Regex _HalfDate = new Regex(@"\A([0-9]{2,4})/([0-9]{2})/([0-9]{2})\z");     //半角日付文字
static private Regex _HalfPhone = new Regex(@"\A\d{1,4}-\d{1,4}-\d{1,4}\z");               //半角電話番号
static private Regex _HalfPost = new Regex(@"\A\d{1,3}-\d{1,4}\z");                        //半角郵便番号
static private Regex _DblKatakana = new Regex("^[ァ-ヴ!ー]+$");                            //全角カナ文字
static private Regex _DblHiragana = new Regex("^[ぁ-ん!ー]+$");                            //全角かな文字

/// <summary>
/// 特定文字列か判断する
/// </summary>
/// <param name="regex"></param>
/// <param name="s"></param>
/// <returns></returns>
static private bool _IsMatchString(Regex regex, string s)
{
    if (!regex.IsMatch(s))
    {
        return false;
    }
    return true;
}

// 半角日付文字列か判断する
static public bool IsHalfDateStr(string s)
{
    return _IsMatchString(_HalfDate, s);
}

//  半角日付文字列か判断する
static public bool IsHalfTimeStr(string s)
{
    return _IsMatchString(_HalfTime, s);
}

// 半角電話番号文字列か判断する
static public bool IsHalfPhoneStr(string s)
{
    return _IsMatchString(_HalfPhone, s);
}

// 半角郵便番号文字列か判断する
static public bool IsHalfPostStr(string s)
{
    return _IsMatchString(_HalfPost, s);
}

// 全角カタカナ文字列か判断する
static public bool IsDblKatakanaStr(string s)
{
    return _IsMatchString(_DblKatakana, s);
}

// 全角ひらがな文字列か判断する
static public bool IsDblHiraganaStr(string s)
{
    return _IsMatchString(_DblHiragana, s);
}

文字列判断を全て正規表現にて行うこともできます。速度などの問題を考慮して、どちらを使うかご自分で判断してください。

 

C# RadioGroup継承以外での作成

継承ができない場合の RadioGroupの作成例です。

 機能追加したラジオボタン

ラジオボタンにインデックスをオブジェクト値を追加したオブジェクトを作成

/// <summary>
/// 機能追加したラジオボタン
/// </summary>
class RadioButtonUp
{
    public RadioButtonUp(RadioButton rbtn)
    {
        _RadioButton = rbtn;

        this.Index = -1;
        this.Value = null;
    }

    public RadioButton Button
    {
        get
        {
            return _RadioButton;
        }
    }
    RadioButton _RadioButton = null;

    public int Index
    {
        set
        {
            _Index = value;
        }
        get
        {
            return _Index;
        }
    }
    private int _Index;

    public object Value
    {
        set
        {
            _Value = value;
        }
        get
        {
            return _Value;
        }
    }
    private object _Value;
}

RadioGroupの作成

namespace RadioGroupSample
{
    delegate void RadioGroup_onClick_Delegate(EventArgs e);

    class RadioGroup
    {
        Hashtable _ht = new Hashtable();
        GroupBox _GroupBox = null;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="sender">グループボックス</param>
        public RadioGroup(GroupBox sender)
        {
            System.Collections.ArrayList al = new System.Collections.ArrayList();

            _GroupBox = sender;

            //ラジオボタンの名前を取得し並び替える
            foreach (RadioButton rbtn in sender.Controls)
            {
                al.Add(rbtn.Name);
                rbtn.Click += new EventHandler(this._onClick);
            }
            al.Sort();

            //ラジオボタン設定
            int index = 0;
            foreach (string name in al)
            {
                RadioButton rb = (RadioButton)_GroupBox.Controls[name];
                RadioButtonUp rbup = new RadioButtonUp(rb);
                rbup.Index = index;

                _ht.Add(name, rbup);
                index++;
            }
        }

        /// <summary>
        /// インデックスの取得及び設定をします。
        /// </summary>
        public int ItemIndex
        {
            set
            {
                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Index == value)
                    {
                        rb.Button.Checked = true;
                    }
                }
            }

            get
            {
                int index = -1;

                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Button.Checked)
                    {
                        index = rb.Index;
                        break;
                    }
                }
                return index;
            }
        }

        /// <summary>
        /// 現在のインデックス位置の値を取得する。
        /// </summary>
        public object ItemValue
        {
            get
            {
                object val = null;

                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Button.Checked)
                    {
                        val = rb.Value;
                        break;
                    }
                }
                return val;
            }
        }

        /// <summary>
        /// ボタン名毎に値を設定します。
        /// </summary>
        /// <param name="name"></param>
        /// <param name="val"></param>
        /// <returns></returns>
        public bool setValue(string name, object val)
        {
            bool bc = false;

            if (_ht.ContainsKey(name))
            {
                RadioButtonUp rb = (RadioButtonUp)_ht[name];
                rb.Value = val;
                bc = true;
            }

            return bc;
        }

        /// <summary>
        /// クリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _onClick(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;

            if (rb.Checked)
            {
                onClick(e);
            }
        }

        public event RadioGroup_onClick_Delegate onClick = delegate (EventArgs e) { };

    }
}

呼び出し側

private void Form1_Load(object sender, EventArgs e)
{
    _radioGroup1 = new RadioGroup(groupBox1);
    _radioGroup1.onClick += RadioGroup1_onClick;

    _radioGroup1.setValue("radioButton1", 10);
    _radioGroup1.setValue("radioButton2", 20);
    _radioGroup1.setValue("radioButton3", 30);
}

RadioGroup _radioGroup1 = null;

private void button1_Click(object sender, EventArgs e)
{
    int no = _radioGroup1.ItemIndex;
    int v = (int)_radioGroup1.ItemValue;
}

public void RadioGroup1_onClick(EventArgs e)
{
    int no = _radioGroup1.ItemIndex;
}