Back to Top

Monthly Archives: 5月 2016

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# テキストボックス(TextBox)入力制御

Visual Studio等でC#を使用してGUIアプリケーションを作成する場合に使用するTextBoxの説明です。

TextBoxで入力文字(数値・実数・カタカナ・ひらがな・全角文字・半角文字 など)制御をする際の例を記載します。

 

文字列制御関数

入力文字の制御を行いたい文字列の列挙体 InputTextType を作成します。以下の列挙体は例ですので、制御した文字列項目を追加作成して下さい。(列挙体を作成するのは汎用性をもたせるためです)

//入力文字列種別列挙体
public enum InputTextType : short
{
    // 文字(チェックなし)
    String,

    // 整数値
    Digit,

    // 全角カタカナ
    Katakana,
}

特定の文字列に含まれる文字(整数文字・全角カタカナ・TELなど)を判断する関数CheckChar()

特定の文字列を判断する関数CheckString()

を作成します。(文字チェック関数・文字列チェック関数を作成するのは、汎用性を持たせるためです)

//文字のチェックをします。
static public bool CheckChar(char c, InputTextType mode)
{
    bool bc = false;

    switch (mode)
    {
        case InputTextType.Digit:
            bc = IsHalfDigit(c);
            break;
        case InputTextType.Katakana:
            bc = IsDblKatakana(c);
            break;
        default:
            break;
    }

    return (bc);
}

//文字列のチェックをします。
static public bool CheckString(string s, InputTextType mode)
{
    bool bc = false;

    switch (mode)
    {
        case InputTextType.Digit:
            bc = IsHalfDigitStr(s);
            break;
        case InputTextType.Katakana:
            bc = IsDblKatakanaStr(s);
            break;
        default:
            break;
    }

    return (bc);
}

※文字と文字列を判断する関数等の例(IsHalfDigit・IsHalfDigitStr関数等は特定文字の判断をご覧ください)

 

半角数値入力制御の例

TextBoxの入力制御は、Enter・Leave・KeyPress・KeyDownイベントで制御します。

EnterとLeaveではおもに、[ENTER]キーではなく、マウスでフォーカス移動された時のために処理しています。

KeyPressでは、特定文字列に含まれる文字以外は、入力出来ないようにしています。

KeyDownでは、[ENTER]キーを押された場合と、特殊キー(ESC・↑・↓)の処理をしています。

private void textBox1_Enter(object sender, EventArgs e)
{
    ((TextBox)sender).ClearUndo();
    ((TextBox)sender).SelectAll();
}

private void textBox1_Leave(object sender, EventArgs e)
{
    ((TextBox)sender).Undo();
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\b')
    {
        return;
    }

    if (!CheckChar(e.KeyChar, InputTextType.Digit))
    {
        e.Handled = true;
    }
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
            this.ProcessTabKey(false);
            break;
        case Keys.Down:
            this.ProcessTabKey(true);
            break;
        case Keys.Tab:
            e.Handled = false;
            break;
        case Keys.Escape:
            ((TextBox)sender).Undo();
            ((TextBox)sender).ClearUndo();
            break;
        case Keys.Enter:
            bool bc = CheckString(((TextBox)sender).Text, InputTextType.Digit);
            if (bc)
            {
                ((TextBox)sender).ClearUndo();
                this.ProcessTabKey(true);
                e.Handled = false;
            }
            break;
        default:
            break;
    }
}

CheckChar()・とCheckString()のInputTextType列挙体の値を変えることにより入力文字列を制御できます。

以上TextBoxでの入力制御の方法の例です。

※ちなみに以上の制御では、クリップボードによるコピーは避けられません。