C#正則表達式文本框驗證:只能輸入整數和帶兩位小數的小數



C#正則表達式文本框驗證:只能輸入整數和帶兩位小數的小數

 

程序界面截圖:

本文主要包含以下內容:

  1. 測試用例介紹

  2. 測試用例下載地址;

  3. 文本框校驗的解決思路;

  4. 參考資料;

 

 

一、測試用例介紹。

1、平臺環境:Visual Studio 2010C#;

2、測試目的:

對於文本框數據輸入的合法性進行自定義限制,本例要求只能夠輸入整數或小數(若爲小數,小數點後只能保留兩位)。

3、主要實現功能:

1)匹配整數;

2)匹配只保留兩位小數位的小數;

3)自動將全角數字轉化爲半角數字;

4)文本框輸入長度限制;

5)文本框輸入時禁用輸入法;

6)其他非法輸入時鎖定本控件,並提示錯誤。

4、程序界面截圖:

如上圖所示。

二、測試用例下載地址。

下載地址:測試Demo源碼免積分下載

三、文本框校驗的解決思路。

對於文本框輸入的校驗有不同的思路,本例採用了正則表達式匹配的方法。

1、即時驗證:

爲了即時對文本框內容進行驗證,可以利用控件的validating事件,當控件失去焦點時,便會觸發該事件。

2、正則表達式:

將要驗證的有效格式寫成正則表達式,不僅可以方便快捷地進行匹配,而且對於以後需求更改時也易於修改(只需修改正則表達式即可)。

利用正則表達式時,需要添加引用:< usingSystem.Text.RegularExpressions; >

3、驗證完成:

驗證通過後進行的操作可以使用控件的validated事件。例如,如果在驗證不通過時有錯誤提示的話,那麼驗證通過時就可以給出驗證通過的提示。該事件可根據實際需要選用。

4、正常退出:

Validating事件中做驗證處理時,如果驗證不通過,本例希望焦點仍停留在該文本框內,即只有輸入合法才能進行其他操作。這樣的負作用之一就是用戶在輸入不合法時也無法正常退出程序,因此爲使關閉程序的操作不受文本框驗證的影響而正常使用,可以在FormClosing事件中添加e.Cancel=false來解決。

5、限制輸入長度:

如果用戶不小心壓住了某個數字鍵,此時文本框裏已經輸入了100多位的數據,而且又恰好點擊了“提交”按鈕時,你能保證後臺代碼能接受這個結果嗎?你如果也有這樣的擔心,那就試試控件的maxLength屬性吧。

6、禁用輸入法:

本例要求只能輸入數字,因此如果禁用輸入法後會省去很多麻煩。禁用後,無法直接輸入中文,也無法“直接”輸入全角字符。去查查控件的ImeMode屬性,設置爲disabled後就可以了。

7、全角字符串的處理:

知道上一步爲什麼說禁用輸入法後無法“直接”輸入全角字符嗎?因爲還可以“間接”輸入!是的,那就是將全角字符串複製後粘貼過來。不要以爲抽風的人才會這麼無聊幫你去找Bug,程序員還是應該儘量把可能的異常先做好預防。(當然,禁用文本框的粘貼功能也不錯,本例爲照顧用戶可能存在的粘貼較長數據的需要,沒有禁用。大家可以自行搜下禁用粘貼的資料。)

如果文本框裏含全角字符,在後期做數據運算時很容易出問題,本例解決方法是先檢查,若是全角字符串則轉換爲半角字符串。

 

心得體會:

寫出一個完全正確且符合自己要求的正則表達式確實需要好好構思,尤其是匹配內容較複雜時。但也不必擔心,如果一個表達式完不成,可以寫多個表達式然後“或”運算。在寫正則表達式時不要盲目地參看網上已有的表達式,最好做個測試程序驗證下,因爲不同的語言正則表達式語法會有細微的不同。

對於正則表達式,大家先對照着MSDN上的介紹,熟悉每個符號的意思,再去理解別人寫的表達式,慢慢就能寫出自己的表達式了。對於正則表達式的理解,不妨想想中學學過的“排列組合”,會有用的。用排列組合把表達式中可能的各個分支完整走一遍,就都懂了。

主要參考代碼:(詳細代碼可查看上面第二步中的“測試程序源碼下載”)

//以下代碼僅爲示例,非全部代碼,詳細請查看下載地址提供的源碼
        private void tbInput_Validating(object sender, CancelEventArgs e)
        {
            string errorMsg;

            if (!IsNumberic(tbInput.Text.Trim(), out errorMsg))
            {
                e.Cancel = true;
                tbInput.Select(0, tbInput.Text.Length);
                this.errorProvider1.SetError(tbInput, errorMsg);
                //Console.WriteLine("輸入非法!!");                
            }
        }        

        #region 輸入是否合法
        public bool IsNumberic(string message, out string errorMsg)
        {
            //示例(非全部代碼)            
            string temp = @"(^(\d(\.\d{2})?){1}$)";
            Regex rex = new Regex(temp);

            if (rex.IsMatch(message))
            {
                //...
            }
            else
            {
                //...
            }
        }
        #endregion
        
        public static bool IsSDC(string strSDC)
        {
            //...
        }
       
        public static string ToDBC(string strSBC)
        {
            //...
        }
       
        private void tbInput_Validated(object sender, EventArgs e)
        {
            //如果所有條件都滿足的話,清除ErrorProvider中的錯誤信息。
            errorProvider1.SetError(tbInput, "");
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //這裏是爲了確保關閉窗口功能不受影響
            e.Cancel = false;
        }


 

四、參考資料。

1C#正則表達式:參考資料1 參考資料2


2、正則表達式匹配數字:參考資料3


3C#全角和半角轉換:參考資料4



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章