[ASP.NET]以自訂擴充方法增加String判斷全形功能

  • 7473
  • 0
  • 2012-05-01

[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 = "無全形字";
  }

 

image

 

 

 

2012.5.1補充:
 
在Plurk上看到Allen大的一個討論串有關Regex 效能議題,這部份確實在這個本文中
並未加以探討跟注意,討論中demo大提供了一則好文,由johnny大所寫的
值得注意的 Regular Expression 樣式的潛在風險』,另外Allen大也針對判斷全形
的功能,寫了另一則範例程式判斷字元是不是全形ASCII code』,感謝大家的討論 :)
,讓本文得以有補充不足及缺失的機會。

 

Ref:

(1)擴充方法 (C# 程式設計手冊)

(2)HOW TO:實作和呼叫自訂擴充方法 (C# 程式設計手冊)

(3)ASCII

(4)HOW TO:在十六進位字串和數字型別間轉換 (C# 程式設計手冊)

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18