[ASP.NET]以自訂擴充方法增加String判斷全形功能
最近在專案上有個需求,是要把來自於使用者輸入的內容找出是否有全形字的存在
但中文字並不包含在內,由於這個規則是要套用至整個專案內的,且在.Net中並
未內建有這類的判斷Method,因此考量統一程式碼以及程式碼簡潔性,便決定以
Extension Method 擴充原有String型別的功能。
功能描述:
- 除中文字外,其餘文字不得包含全形字
 
實作:
- 建立String Extension Method類別庫
 - 實作『排除中文字判斷字串是否含全形字』Extension Method
 - ASPX引用Extension Method進行字串判斷
 
程式碼說明 :
(1)以Regular Expression先排除中文字,再以16進位值長度來判定是否為全形字
,以英數字及符號來說其16進位值長度均為2(佔1個byte)
(2)撰寫Extension Method很
- 定義靜態類別用以包含擴充方法(範例中的StringExtensionMethods靜態類別)
 - 
		加入靜態方法,第一個參數會指定方法進行作業的型別,前面必須加上 this
修飾詞。(範例中的FullWidthWord Method) 
 public static class StringExtensionMethods
    {
        public static bool FullWidthWord(this String values)
        {
            bool result = false;
            string pattern = @"^[\u4E00-\u9fa5]+$";
            foreach (char item in values)
            {
                //以Regex判斷是否為中文字,中文字視為全形
                if (!Regex.IsMatch(item.ToString(), pattern))
                {
                    //以16進位值長度判斷是否為全形字
                    if (string.Format("{0:X}", Convert.ToInt32(item)).Length != 2)
                    {
                        result = true;
                        break;
                    }
                }
            }
            return result;
        }
    }
(3)引用擴充類別命名空間(自行定義)
using ExtensionMethods;
(4)String即可使用FullWidthWord自訂的擴充方法
 protected void Button1_Click(object sender, EventArgs e)
 {
            if (this.TextBox1.Text.FullWidthWord())
                this.TextBox2.Text = "有全形字";
            else
                this.TextBox2.Text = "無全形字";
  }
	2012.5.1補充:
	在Plurk上看到Allen大的一個討論串有關Regex 效能議題,這部份確實在這個本文中
	並未加以探討跟注意,討論中demo大提供了一則好文,由johnny大所寫的
	『值得注意的 Regular Expression 樣式的潛在風險』,另外Allen大也針對判斷全形
	的功能,寫了另一則範例程式『判斷字元是不是全形ASCII code』,感謝大家的討論 :)
	,讓本文得以有補充不足及缺失的機會。
Ref:
(2)HOW TO:實作和呼叫自訂擴充方法 (C# 程式設計手冊)
(3)ASCII
(4)HOW TO:在十六進位字串和數字型別間轉換 (C# 程式設計手冊)
若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。
                By No.18