除了向你展示如何使用.NET框架中的字符串外,本文還將向你介紹正規表達式。正規表達式是格式代碼,不僅允許你驗證一個特定字符串匹配一個給定的格式,而且你還可以使用正規表達式來從任何其它可能被認爲是自由格式的文本中提取有意義的信息,例如從用戶輸入中提取第一個名字,或從一個數字輸入中提取代碼,或從一個URL中提取服務器名。
一、 使用字符串
使用字符串是創建高質量應用程序的一個必要的技巧。即使你在處理數字或圖像數據,終端用戶也需要上下文反饋。本文將向你介紹.NET字符串,如何格式它們,操作它們和比較它們,及其它有用的操作。
(一) .NET字符串簡介
在.NET框架和通用語言運行時刻(CLR)以前,開發者總是花費大量時間處理字符串。一個字符串例程可重用庫幾乎是每一個C和C++程序員的工具箱中的一部分。編寫在不同程序語言之間交換字符串數據的代碼也是相當困難的。例如,Pascal把字符串存儲爲一個內存字符數組,其中,該數組的第一個元素指示字符串的長度;而C把字符串存儲爲一個具有可變長度的字符內存數組,字符串的末端加上一個ASCII null字符(在C中以"/0"表示)。
在.NET框架中,字符串以常量方式存儲。這意味着,當你用C#(或任何其它.NET語言)創建一個字符串時,該字符串以一種固定大小存儲在內存以便CLR運行更快些。結果是,當你實現例如連接字符串或修改一個字符串中的單個字符時,CLR實際上是創建你的字符串的多個副本。
C#中的字符串與其它值類型例如整數或浮點數聲明方式相同,見下面的例子:
string x = "Hello World"; string y; string z = x; |
(二) 格式化字符串
當使用字符串時最常見的一項任務是格式化字符串。當向用戶顯示信息時,你經常顯示如日期,時間,數字值,十進制值,貨幣值,甚至象十六進制數字這樣的內容。C#字符串都能夠顯示這些類型的信息,甚至更多。另外一個強有力的特徵是,當你使用該標準格式化工具時,該格式化的輸出具有地區感知特徵。例如,如果你以短格式顯示一個英格蘭用戶的當前日期,那麼對於一個美國用戶來說,當前日期的短格式將以不同形式顯示。
爲了創建一個格式化的字符串,你僅需要調用string類的Format方法,並且傳遞給它一個格式字符串,如下列代碼所顯示的:
string formatted = string.Format("The value is {0}", value); |
在此,{0}佔位符指示一個值應該被插入的位置。除了指定一個值應該被插入的位置外,你還可以指定該值的格式。
其它數據類型還支持經由定製格式修飾符轉換成字符串,例如,DateTime數據類型,通過使用如下方式,它能夠產生一種定製格式的輸出:
DateTime.ToString("format specifiers"); |
表格1列舉了用於格式化日期,時間,數字值等數據的一些最常用的格式字符串。
表格1.定製DateTime格式修飾符
修飾符 | 描述 |
d | 顯示某月中的這一天。 |
dd | 顯示某月中的這一天,其中,小於10的值之前加上一個0。 |
ddd | 顯示一個星期中某一天的三字母縮寫名。 |
dddd(+) | 顯示給定的DateTime值中星期中的一天的完整名。 |
f(+) | 顯示秒值的最重要的x位數。在f中格式修飾符位數越多,該數字越重要。這是個總秒數,而不是從上個分鐘以來經過的秒數。 |
F(+) | 與f(+)相同,除了不顯示末尾的零外。 |
g | 顯示一個給定的DateTime中的時代,例如,"A.D"。 |
h | 顯示小時,範圍爲:1~12。 |
hh | 顯示小時,範圍爲:1~12,其中,小於10的值之前加上一個0。 |
H | 顯示小時範圍爲:0~23。 |
HH | 顯示小時範圍爲:0~23,其中,小於10的值之前加上一個0。 |
m | 顯示分鐘,範圍爲0~59。 |
mm | 顯示分鐘,範圍爲0~59,其中,小於10的值之前加上一個0。 |
M | 顯示月份,範圍爲1~12。 |
MM | 顯示月份,範圍爲1~12,其中,小於10的值之前加上一個0。 |
MMM | 顯示月份的三字符縮略名。 |
MMMM | 顯示月份的完整名字。 |
s | 顯示秒數範圍爲:0~59。 |
ss(+) | 顯示秒數範圍爲:0~59,其中,小於10的值之前加上一個0。 |
t | 顯示給定的時間中AM/PM指示器中的第一個字符。 |
tt(+) | 顯示給定的時間中完整的AM/PM指示器。 |
y/yy/yyyy | 顯示給定的時間中的年份。 |
z/zz/zzz(+) | 顯示給定的時間中的時區偏移量。 |
讓我們觀察下列代碼,它展示使用字符串格式修飾符創建定製格式的日期和時間字符串:
DateTime dt = DateTime.Now; Console.WriteLine(string.Format("Default format: {0}", dt.ToString())); Console.WriteLine(dt.ToString("dddd dd MMMM, yyyy g")); Console.WriteLine(string.Format("Custom Format 1: {0:MM/dd/yy hh:mm:sstt}", dt)); Console.WriteLine(string.Format("Custom Format 2: {0:hh:mm:sstt G//MT zz}", dt)); |
下面是前面代碼的輸出:
Default format: 9/24/2005 12:59:49 PM Saturday 24 September, 2005 A.D. Custom Format 1: 09/24/05 12:59:49PM Custom Format 2: 12:59:49PM GMT -06 |
你還可以提供針對數字值的定製格式修飾符。表格2描述了適用於數字值的定製格式修飾符。
表格2.數字定製格式修飾符
修飾符 | 描述 |
0 | 零佔位符。 |
# | 數字佔位符。如果給定的值中在#修飾符指示的位置有一個數字,那麼該數字將以格式化輸出顯示。 |
. | 十進制點。 |
, | 千分位分隔符。 |
% | 百分比修飾符。被格式化的值在包括到格式化的輸出前將乘以100。 |
E0/E+0/e/e+0/e-0/E | 科學標誌。 |
"XX"或"XX" | 代表格式的字符串。這些被包含在格式化的輸出中,而不翻譯其相對位置。 |
; | 用於條件格式化負數,零和正值的節分隔符。 |
如果定義多個格式節,那麼你可以更精確地控制數字的格式化:
· 兩個節-如果你有兩個格式化節,則第一節應用於所有正數(包括0)值。第二節應用於負數值,當你想把負數值包括在括號中(就象中許多財務軟件包中一樣),這是十分方便的。
· 三個節-如果你有三個格式化節,則第一個節應用於所有正數(不包括0)值。第二節應用於負數值,第三節應用於零。
下列代碼顯示如何使用定製數字格式修飾符。
double dVal = 59.99; double dNeg = -569.99; double zeroVal = 0.0; double pct = 0.23; string formatString = "{0:$#,###0.00;($#,###0.00);nuttin}"; Console.WriteLine(string.Format(formatString, dVal)); Console.WriteLine(string.Format(formatString, dNeg)); Console.WriteLine(string.Format(formatString, zeroVal)); Console.WriteLine(pct.ToString("00%")); |
前面的代碼將產生如下所示的輸出結果:
$59.99
($569.99)
nuttin
23%