C# 格式串

iDotNetSpace發表於2009-04-23

一、用{0:?}格式化

可通過 String.Format 方法或通過 Console.Write 方法格式化數值結果,其中後一種方法呼叫 String.Format。使用格式字串指定格式。下表包含受支援的標準格式字串。格式字串採用的形式為 Axx,其中 A 為“格式說明符”,而 xx 為“精度說明符”。格式說明符控制應用於數值的格式化型別,而精度說明符控制格式化輸出的有效位數或小數位數。

有關標準及自定義格式化字串的更多資訊,請參閱格式化概述。有關 String.Format 方法的更多資訊,請參閱 String.Format 方法。

字元 說明 示例 輸出
C 或 c 貨幣 Console.Write("{0:C}", 2.5);

Console.Write("{0:C}", -2.5);

$2.50

($2.50)

D 或 d 十進位制 Console.Write("{0:D5}", 25); 00025
E 或 e 科學型 Console.Write("{0:E}", 250000); 2.500000E+005
F 或 f 固定點 Console.Write("{0:F2}", 25);

Console.Write("{0:F0}", 25);

25.00

25

G 或 g 常規 Console.Write("{0:G}", 2.5); 2.5
N 或 n 數字 Console.Write("{0:N}", 2500000); 2,500,000.00
X 或 x 十六進位制 Console.Write("{0:X}", 250);

Console.Write("{0:X}", 0xffff);

FA

FFFF


二、日期格式化

標準 DateTime 格式字串

如果格式字串只包含下表列出的某個單個格式說明符,則它們被解釋為標準格式說明符。如果指定的格式字元是單個字元並且不包含在下表中,則引發異常。如果格式字串在長度上比單個字元長(即使多餘的字元是空白),則格式字串被解釋為自定義格式字串。請注意,這些格式說明符產生的模式受“區域選項”控制皮膚中的設定的影響。具有不同區域性或不同日期與時間設定的計算機將顯示不同的模式。

格式字串顯示的時間和日期分隔符由與當前區域性的 DateTimeFormat 屬性關聯的 DateSeparator 和 TimeSeparator 字元定義。然而,如果 InvariantCulture 被“r”、“s”和“u”說明符引用,與 DateSeparatorTimeSeparator 字元關聯的字元不隨當前區域性更改。下表描述了格式化 DateTime 物件的標準格式字串。

格式說明符 名稱 說明
d 短日期模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.ShortDatePattern 屬性定義的模式或者由指定格式提供程式定義的模式。
D 長日期模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.LongDatePattern 屬性定義的模式或者由指定格式提供程式定義的模式。
t 短時間模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.ShortTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。
T 長時間模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.LongTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。
f 完整日期/時間模式(短時間) 顯示長日期和短時間模式的組合,由空格分隔。
F 完整日期/時間模式(長時間) 顯示由與當前執行緒關聯的 DateTimeFormatInfo.FullDateTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。
g 常規日期/時間模式(短時間) 顯示短日期和短時間模式的組合,由空格分隔。
G 常規日期/時間模式(長時間) 顯示短日期和長時間模式的組合,由空格分隔。
M 或 m 月日模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.MonthDayPattern 屬性定義的模式或者由指定格式提供程式定義的模式。
R 或 r RFC1123 模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.RFC1123Pattern 屬性定義的模式或者由指定格式提供程式定義的模式。這是定義的標準,並且屬性是隻讀的;因此,無論所使用的區域性或所提供的格式提供程式是什麼,它總是相同的。屬性引用 CultureInfo.InvariantCulture 屬性並遵照自定義模式“ddd, dd MMMM yyyy HH:mm:ss G\MT”。請注意,“GMT”中的“M”需要轉義符,因此它不被解釋。
s 可排序的日期/時間模式;符合 ISO 8601 顯示由與當前執行緒關聯的 DateTimeFormatInfo.SortableDateTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。屬性引用 CultureInfo.InvariantCulture 屬性,格式遵照自定義模式“yyyy-MM-ddTHH:mm:ss”。
u 通用的可排序日期/時間模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.UniversalSortableDateTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。因為它是定義的標準,並且屬性是隻讀的,因此無論區域性或格式提供程式是什麼,模式總是相同的。格式遵照自定義模式“yyyy-MM-dd HH:mm:ssZ”。
U 通用的可排序日期/時間模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.FullDateTimePattern 屬性定義的模式或者由指定格式提供程式定義的模式。請注意,顯示的時間是通用時間,而不是本地時間。
Y 或 y 年月模式 顯示由與當前執行緒關聯的 DateTimeFormatInfo.YearMonthPattern 屬性定義的模式或者由指定格式提供程式定義的模式。
任何其他單個字元 未知說明符

下表顯示了格式說明符示例的列表,這些示例應用於公開當前日期和時間資訊的 DateTime.Now 的任意值。示例中給出了不同的區域性設定以闡釋更改當前區域性的影響。這通常以下面幾種方式更改:使用 Microsoft Windows 中的“日期/時間”控制皮膚,將您自己的 DateTimeFormatInfo 物件作為格式提供程式傳遞,或將 CultureInfo 物件設定傳遞給不同的區域性。請注意,對於“r”和“s”格式,更改區域性不影響輸出。此表是說明標準日期和時間說明符如何影響格式化的快速指南。請參閱該表下面闡釋這些說明符的程式碼示例部分。

格式說明符 當前區域性 輸出
d en-US 4/10/2001
d en-NZ 10/04/2001
d de-DE 10.04.2001
D en-US Tuesday, April 10, 2001
T en-US 3:51:24 PM
T es-ES 15:51:24
f en-US Tuesday, April 10, 2001 3:51 PM
f fr-FR mardi 10 avril 2001 15:51
r en-US Tue, 10 Apr 2001 15:51:24 GMT
r zh-SG Tue, 10 Apr 2001 15:51:24 GMT
s en-US 2001-04-10T15:51:24
s pt-BR 2001-04-10T15:51:24
u en-US 2001-04-10 15:51:24Z
u sv-FI 2001-04-10 15:51:24Z
m en-US April 10
m ms-MY 10 April
y en-US April, 2001
y af-ZA April 2001
L en-UZ 無法識別的格式說明符;引發格式異常。

下面的程式碼示例闡釋如何使用對 DateTime 物件使用自定義格式字串。

DateTime dt = DateTime.Now;DateTimeFormatInfo dfi = new DateTimeFormatInfo();CultureInfo ci = new CultureInfo("de-DE");// Make up a new custom DateTime pattern, for demonstration.dfi.MonthDayPattern = "MM-MMMM, ddd-dddd";// Use the DateTimeFormat from the culture associated // with the current thread.Console.WriteLine( dt.ToString("d") );    Console.WriteLine( dt.ToString("m") );// Use the DateTimeFormat from the specific culture passed.Console.WriteLine( dt.ToString("d", ci ) );// Use the settings from the DateTimeFormatInfo object passed.Console.WriteLine( dt.ToString("m", dfi ) );// Reset the current thread to a different culture.Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-BE");Console.WriteLine( dt.ToString("d") );

自定義 DateTime 格式字串

有時需要對 DateTime 物件的格式化有更多的控制。作為標準 DateTime 格式的替換方法,您可以使用自定義 DateTime 格式字串構造您自己的 DateTime 格式化模式。實際上,標準格式就是從這些自定義格式說明符派生的。

下表顯示了自定義格式說明符並描述了它們產生的值。這些字串的輸出受“區域選項”控制皮膚中的當前區域性和設定的影響。

格式說明符 說明
d 顯示月份的當前日期,以 1 到 31 之間的一個數字表示,包括 1 和 31。如果日期只有一位數字 (1-9),則它顯示為一位數字。

請注意,如果“d”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準短日期模式格式說明符。如果“d”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

dd 顯示月份的當前日期,以 1 到 31 之間的一個數字表示,包括 1 和 31。如果日期只有一位數字 (1-9),則將其格式化為帶有前導 0 (01-09)。
ddd 顯示指定 DateTime 物件的日部分縮寫名稱。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 AbbreviatedDayNames 屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定格式提供程式的 AbbreviatedDayNames 屬性。
dddd(外加任意數量的附加“d”字元) 顯示指定 DateTime 物件的日部分全名。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 DayNames 屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定格式提供程式的 DayNames 屬性。
f 顯示以一位數字表示的秒。

請注意,如果“f”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為完整的(長日期 + 短時間)格式說明符。如果“f”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

ff 顯示以二位數字表示的秒。
fff 顯示以三位數字表示的秒。
ffff 顯示以四位數字表示的秒。
fffff 顯示以五位數字表示的秒。
ffffff 顯示以六位數字表示的秒。
fffffff 顯示以七位數字表示的秒。
g 或 gg(外加任意數量的附加“g”字元) 顯示指定 DateTime 物件的年代部分(例如 A.D.)。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則年代由與 DateTimeFormat 物件關聯的日曆及其與當前執行緒關聯的當前區域性確定。

請注意,如果“g”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準常規格式說明符。如果“g”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

h 以 1 到 12 這一範圍中的一個數字顯示指定 DateTime 物件的小時部分。該小時部分表示自午夜(顯示為 12)或中午(也顯示為 12)後所經過的整小時數。如果單獨使用這種格式,則無法區別某一小時是中午以前還是中午以後的時間。如果該小時是單個數字 (1-9),則它顯示為單個數字。顯示小時時不發生任何舍入。例如,DateTime 為 5:43 時返回 5。
hh, hh(外加任意數量的附加“h”字元) 以 1 到 12 這一範圍中的一個數字顯示指定 DateTime 物件的小時部分。該小時部分表示自午夜(顯示為 12)或中午(也顯示為 12)後所經過的整小時數。如果單獨使用這種格式,則無法區別某一小時是中午以前還是中午以後的時間。如果該小時是單個數字 (1-9),則將其格式化為前面帶有 0 (01-09)。
H 以 0 到 23 這一範圍中的一個數字顯示指定 DateTime 物件的小時部分。該小時部分表示自午夜(顯示為 0)後所經過的整小時數。如果該小時是單個數字 (0-9),則它顯示為單個數字。
HH, HH(外加任意數量的附加“H”字元) 以 0 到 23 這一範圍中的一個數字顯示指定 DateTime 物件的小時部分。該小時部分表示自午夜(顯示為 0)後所經過的整小時數。如果該小時是單個數字 (0-9),則將其格式化為前面帶有 0 (01-09)。
m 以 0 到 59 這一範圍中的一個數字顯示指定 DateTime 物件的分鐘部分。該分鐘部分表示自上個小時後所經過的整分鐘數。如果分鐘是一位數字 (0-9),則它顯示為一位數字。

請注意,如果“m”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準的月日模式格式說明符。如果“m”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

mm, mm(外加任意數量的附加“m”字元) 以 0 到 59 這一範圍中的一個數字顯示指定 DateTime 物件的分鐘部分。該分鐘部分表示自上個小時後所經過的整分鐘數。如果分鐘是一位數字 (0-9),則將其格式化為帶有前導 0 (01-09)。
M 顯示當前月份,以 1 到 12 之間的一個數字表示,包括 1 和 12。如果月份是一位數字 (1-9),則它顯示為一位數字。

請注意,如果“M”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準的月天模式格式說明符。如果“M”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

MM 顯示當前月份,以 1 到 12 之間的一個數字表示,包括 1 和 12。如果月份是一位數字 (1-9),則將其格式化為帶有前導 0 (01-09)。
MMM 顯示指定 DateTime 物件的月部分縮寫名稱。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 AbbreviatedMonthNames 屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定格式提供程式的 AbbreviatedMonthNames 屬性。
MMMM 顯示指定 DateTime 物件的月部分全名。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 MonthNames 屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定格式提供程式的 MonthNames 屬性。
s 以 0 到 59 這一範圍中的一個數字顯示指定 DateTime 物件的秒部分。該秒部分表示自上一分鐘後經過的整秒數。如果秒是一位數字 (0-9),則它僅顯示為一位數字。

請注意,如果“s”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準的可排序日期/時間模式格式說明符。如果“s”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

ss, ss(外加任意數量的附加“s”字元) 以 0 到 59 這一範圍中的一個數字顯示指定 DateTime 物件的秒部分。該秒部分表示自上一分鐘後經過的整秒數。如果秒是一位數字 (0-9),則將其格式化為帶有前導 0 (01-09)。
t 顯示指定 DateTime 物件 A.M./P.M. 指示項的第一個字元。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 AMDesignator(或 PMDesignator)屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定 IFormatProviderAMDesignator(或 PMDesignator)屬性。如果對於指定的 DateTime 所經過的總整小時數小於 12,則使用 AMDesignator。否則,使用 PMDesignator

請注意,如果“t”格式說明符單獨使用,沒有其他自定義格式字串,則它被解釋為標準的長時間模式格式說明符。如果“t”格式說明符與其他自定義格式說明符一起傳遞,則它被解釋為自定義格式說明符。

tt, tt(外加任意數量的附加“t”字元) 顯示指定 DateTime 物件的 A.M./P.M. 指示項。如果未提供特定的有效格式提供程式(實現具有預期屬性的 IFormatProvider 的非空物件),則使用 DateTimeFormat 物件的 AMDesignator(或 PMDesignator)屬性及其與當前執行緒關聯的當前區域性。否則,使用來自指定 IFormatProviderAMDesignator(或 PMDesignator)屬性。如果對於指定的 DateTime 所經過的總整小時數小於 12,則使用 AMDesignator。否則,使用 PMDesignator
y 將指定 DateTime 物件的年份部分顯示為位數最多為兩位的數字。忽略年的前兩位數字。如果年份是一位數字 (1-9),則它顯示為一位數字。
yy 將指定 DateTime 物件的年份部分顯示為位數最多為兩位的數字。忽略年的前兩位數字。如果年份是一位數字 (1-9),則將其格式化為帶有前導 0 (01-09)。
yyyy 顯示指定 DateTime 物件的年份部分(包括世紀)。如果年份長度小於四位,則按需要在前面追加零以使顯示的年份長度達到四位。
z 僅以整小時數為單位顯示系統當前時區的時區偏移量。偏移量總顯示為帶有前導或尾隨符號(零顯示為“+0”),指示早於格林威治時間 (+) 或遲于格林威治時間 (-) 的小時數。值的範圍是 –12 到 +13。如果偏移量為一位數 (0-9),則將其顯示為帶合適前導符號的一位數。該時區的設定指定為 +X 或 –X,其中 X 是相對 GMT 以小時為單位的偏移量。所顯示的偏移量受夏時制的影響。
zz 僅以整小時數為單位顯示系統當前時區的時區偏移量。偏移量總顯示為帶有前導或尾隨符號(零顯示為“+00”),指示早於格林威治時間 (+) 或遲于格林威治時間 (-) 的小時數。值範圍為 –12 到 +13。如果偏移量為單個數字 (0-9),則將其格式化為前面帶有 0 (01-09) 並帶有適當的前導符號。該時區的設定指定為 +X 或 –X,其中 X 是相對 GMT 以小時為單位的偏移量。所顯示的偏移量受夏時制的影響。
zzz, zzz(外加任意數量的附加“z”字元) 以小時和分鐘為單位顯示系統當前時區的時區偏移量。偏移量總是顯示為帶有前導或尾隨符號(零顯示為“+00:00”),指示早於格林威治時間 (+) 或遲于格林威治時間 (-) 的小時和分鐘數。值範圍為 –12 到 +13。如果偏移量為單個數字 (0-9),則將其格式化為前面帶有 0 (01-09) 並帶有適當的前導符號。該時區的設定指定為 +X 或 –X,其中 X 是相對 GMT 以小時為單位的偏移量。所顯示的偏移量受夏時制的影響。
: 時間分隔符。
/ 日期分隔符。
" 帶引號的字串。顯示轉義符 (/) 之後兩個引號之間的任何字串的文字值。
' 帶引號的字串。顯示兩個“'”字元之間的任何字串的文字值。
%c 其中 c 是標準格式字元,顯示與格式字元關聯的標準格式模式。
\c 其中 c 是任意字元,轉義符將下一個字元顯示為文字。在此上下文中,轉義符不能用於建立轉義序列(如“\n”表示換行)。
任何其他字元 其他字元作為文字直接寫入輸出字串。

DateTime.ToString 傳遞自定義模式時,模式必須至少為兩個字元長。如果只傳遞“d”,則公共語言執行庫將其解釋為標準格式說明符,這是因為所有單個格式說明符都被解釋為標準格式說明符。如果傳遞單個“h”,則引發異常,原因是不存在標準的“h”格式說明符。若要只使用單個自定義格式進行格式化,請在說明符的前面或後面新增一個空格。例如,格式字串“h”被解釋為自定義格式字串。

下表顯示使用任意值 DateTime.Now(該值顯示當前時間)的示例。示例中給出了不同的區域性和時區設定,以闡釋更改區域性的影響。可以通過下列方法更改當前區域性:更改 Microsoft Windows 的“日期/時間”控制皮膚中的值,傳遞您自己的 DateTimeFormatInfo 物件,或將 CultureInfo 物件設定傳遞給不同的區域性。此表是說明自定義日期和時間說明符如何影響格式化的快速指南。請參閱該表下面闡釋這些說明符的程式碼示例部分。

格式說明符 當前區域性 時區 輸出
d, M en-US GMT 12, 4
d, M es-MX GMT 12, 4
d MMMM en-US GMT 12 April
d MMMM es-MX GMT 12 Abril
dddd MMMM yy gg en-US GMT Thursday April 01 A.D.
dddd MMMM yy gg es-MX GMT Jueves Abril 01 DC
h , m: s en-US GMT 6 , 13: 12
hh,mm:ss en-US GMT 06,13:12
HH-mm-ss-tt en-US GMT 06-13-12-AM
hh:mm, G\MT z en-US GMT 05:13 GMT +0
hh:mm, G\MT z en-US GMT +10:00 05:13 GMT +10
hh:mm, G\MT zzz en-US GMT 05:13 GMT +00:00
hh:mm, G\MT zzz en-US GMT -9:00 05:13 GMT -09:00

請注意,在某些語言(如 C#)中,“\”字元在與 ToString 方法共用時,它前面必須有轉義符。

下面的程式碼示例闡釋如何從 DateTime 物件建立自定義格式化字串。此示例假定當前區域性是美國英語 (en-US)。

DateTime MyDate = new DateTime(2000, 1, 1, 0, 0, 0);
String MyString = MyDate.ToString("dddd - d - MMMM");
// In the U.S. English culture, MyString has the value:    "Saturday - 1 - January".
MyString = MyDate.ToString("yyyy gg");
// In the U.S. English culture, MyString has the value: "2000 A.D.".

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-591574/,如需轉載,請註明出處,否則將追究法律責任。

相關文章