使用String.format简化代码
為了取得兩位的月份和日期,之前我使用這樣的代碼:
string month=DateTime.Today.Month.ToString().Length == 2 ?
??? DateTime.Today.Month.ToString() :
??? "0" + DateTime.Today.Month.ToString() ;
string day=DateTime.Today.Day.ToString().Length == 2 ?
??? DateTime.Today.Day.ToString() :
??? "0" + DateTime.Today.Day.ToString() ;
用了三元運算符,比單獨使用if語句要簡化了一些,但使用了String.format之后,
才發現:原來這個更方便,而且功能更強大!
string day = string.Format("{0:D2}",DateTime.ToDay.Day);
以下是一位朋友的總結性文字,拿來做參考.
附:
C#格式化數值結果表
| 字符 | 說明 | 示例 | 輸出 |
| C | 貨幣 | string.Format("{0:C3}", 2) | $2.000 |
| D | 十進制 | string.Format("{0:D3}", 2) | 002 |
| E | 科學計數法 | 1.20E+001 | 1.20E+001 |
| G | 常規 | string.Format("{0:G}", 2) | 2 |
| N | 用分號隔開的數字 | string.Format("{0:N}", 250000) | 250,000.00 |
| X | 十六進制 | string.Format("{0:X000}", 12) | C |
| string.Format("{0:000.000}", 12.2) | 012.200 |
Strings
There really isn't any formatting within a strong, beyond it's alignment. Alignment works for any argument being printed in a String.Format call.
?
| Sample | Generates |
| String.Format("->{1,10}<-", "Hello"); | -> Hello<- |
| String.Format("->{1,-10}<-", "Hello"); | ->Hello <- |
Numbers
Basic number formatting specifiers:
?
| Specifier | Type | Format | Output | Output |
| c | Currency | {0:c} | $1.42 | -$12,400 |
| d | Decimal (Whole number) | {0:d} | System. FormatException | -12400 |
| e | Scientific | {0:e} | 1.420000e+000 | -1.240000e+004 |
| f | Fixed point | {0:f} | 1.42 | -12400.00 |
| g | General | {0:g} | 1.42 | -12400 |
| n | Number with commas for thousands | {0:n} | 1.42 | -12,400 |
| r | Round trippable | {0:r} | 1.42 | System. FormatException |
| x | Hexadecimal | {0:x4} | System. FormatException | cf90 |
Custom number formatting:
?
| Specifier | Type | Example | Output (Passed Double 1500.42) | Note |
| 0 | Zero placeholder | {0:00.0000} | 1500.4200 | Pads with zeroes. |
| # | Digit placeholder | {0:(#).##} | (1500).42 | |
| . | Decimal point | {0:0.0} | 1500.4 | |
| , | Thousand separator | {0:0,0} | 1,500 | Must be between two zeroes. |
| ,. | Number scaling | {0:0,.} | 2 | Comma adjacent to Period scales by 1000. |
| % | Percent | {0:0%} | 150042% | Multiplies by 100, adds % sign. |
| e | Exponent placeholder | {0:00e+0} | 15e+2 | Many exponent formats available. |
| ; | Group separator | see below |
The group separator is especially useful for formatting currency values which require that negative values be enclosed in parentheses. This currency formatting example at the bottom of this document makes it obvious:
Dates
Note that date formatting is especially dependant on the system's regional settings; the example strings here are from my local locale.
?
| Specifier | Type | Example (Passed System.DateTime.Now) |
| d | Short date | 10/12/2002 |
| D | Long date | December 10, 2002 |
| t | Short time | 10:11 PM |
| T | Long time | 10:11:29 PM |
| f | Full date & time | December 10, 2002 10:11 PM |
| F | Full date & time (long) | December 10, 2002 10:11:29 PM |
| g | Default date & time | 10/12/2002 10:11 PM |
| G | Default date & time (long) | 10/12/2002 10:11:29 PM |
| M | Month day pattern | December 10 |
| r | RFC1123 date string | Tue, 10 Dec 2002 22:11:29 GMT |
| s | Sortable date string | 2002-12-10T22:11:29 |
| u | Universal sortable, local time | 2002-12-10 22:13:50Z |
| U | Universal sortable, GMT | December 11, 2002 3:13:50 AM |
| Y | Year month pattern | December, 2002 |
The 'U' specifier seems broken; that string certainly isn't sortable.
Custom date formatting:
?
| Specifier | Type | Example | Example Output |
| dd | Day | {0:dd} | 10 |
| ddd | Day name | {0:ddd} | Tue |
| dddd | Full day name | {0:dddd} | Tuesday |
| f, ff, ... | Second fractions | {0:fff} | 932 |
| gg, ... | Era | {0:gg} | A.D. |
| hh | 2 digit hour | {0:hh} | 10 |
| HH | 2 digit hour, 24hr format | {0:HH} | 22 |
| mm | Minute 00-59 | {0:mm} | 38 |
| MM | Month 01-12 | {0:MM} | 12 |
| MMM | Month abbreviation | {0:MMM} | Dec |
| MMMM | Full month name | {0:MMMM} | December |
| ss | Seconds 00-59 | {0:ss} | 46 |
| tt | AM or PM | {0:tt} | PM |
| yy | Year, 2 digits | {0:yy} | 02 |
| yyyy | Year | {0:yyyy} | 2002 |
| zz | Timezone offset, 2 digits | {0:zz} | -05 |
| zzz | Full timezone offset | {0:zzz} | -05:00 |
| : | Separator | {0:hh:mm:ss} | 10:43:20 |
| / | Separator | {0:dd/MM/yyyy} | 10/12/2002 |
Enumerations
?
| Specifier | Type |
| g | Default (Flag names if available, otherwise decimal) |
| f | Flags always |
| d | Integer always |
| x | Eight digit hex. |
Some Useful Examples
String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);
This will output "$1,240.00" if passed 1243.50. It will output the same format but in parentheses if the number is negative, and will output the string "Zero" if the number is zero.
String.Format("{0:(###) ###-####}", 18005551212);
This will output "(800) 555-1212".
?
變量.ToString()
字符型轉換 轉為字符串
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16進制)
12345.ToString("p"); //生成 1,234,500.00%
格式化日期和數字的字符串經常要用到這個, 就把幫助里面的東西大概整理了一些列在這里了.
下表描述了用來格式化 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 MMM yyyy HH:mm:ss G\MT”。請注意,“GMT”中的“M”需要轉義符,因此它不被解釋。格式化并不修改 DateTime 的值,所以您必須在格式化之前將值調整為 GMT。
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 屬性定義的模式或者由指定格式提供程序定義的模式。
任何其他單個字符 未知說明符
下表描述了標準數字格式字符串。請注意,這些格式說明符產生的輸出字符串受“區域選項”控制面板中的設置的影響。使用不同設置的計算機會生成不同的輸出字符串。
格式說明符 名稱 說明
C 或 c 貨幣 數字轉換為表示貨幣金額的字符串。轉換由用于格式化數字的 NumberFormatInfo 對象的貨幣格式信息控制。精度說明符指示所需的小數位數。如果省略精度說明符,則使用 NumberFormatInfo 給定的默認貨幣精度。
D 或 d 十進制 只有整型才支持此格式。數字轉換為十進制數字 (0-9) 的字符串,如果數字為負,則前面加負號。精度說明符指示結果字符串中所需的最少數字個數。如果需要的話,則用零填充該數字的左側,以產生精度說明符給定的數字個數。
E 或 e 科學計數法(指數) 數字轉換為“-d.ddd...E+ddd”或“-d.ddd...e+ddd”形式的字符串,其中每個“d”表示一個數字 (0-9)。如果該數字為負,則該字符串以減號開頭。小數點前總有一個數字。精度說明符指示小數點后所需的位數。如果省略精度說明符,則使用默認值,即小數點后六位數字。格式說明符的大小寫指示在指數前加前綴“E”還是“e”。指數總是由正號或負號以及最少三位數字組成。如果需要,用零填充指數以滿足最少三位數字的要求。
F 或 f 固定點 數字轉換為“-ddd.ddd...”形式的字符串,其中每個“d”表示一個數字 (0-9)。如果該數字為負,則該字符串以減號開頭。精度說明符指示所需的小數位數。如果忽略精度說明符,則使用 NumberFormatInfo 給定的默認數值精度。
G 或 g 常規 根據數字類型以及是否存在精度說明符,數字會轉換為固定點或科學記數法的最緊湊形式。如果精度說明符被省略或為零,則數字的類型決定默認精度,如下表所示。
Byte 或 SByte:3
Int16 或 UInt16:5
Int32 或 UInt32:10
Int64 或 UInt64:19
Single:7
Double:15
Decimal:29
如果用科學記數法表示數字時指數大于 -5 而且小于精度說明符,則使用固定點表示法;否則使用科學記數法。如果要求有小數點,并且忽略尾部零,則結果包含小數點。如果精度說明符存在,并且結果的有效數字位數超過指定精度,則通過舍入刪除多余的尾部數字。使用科學記數法時,如果格式說明符是“G”,結果的指數帶前綴“E”;如果格式說明符是“g”,結果的指數帶前綴“e”。
上述規則有一個例外:如果數字是 Decimal 而且省略精度說明符時。在這種情況下總使用固定點表示法并保留尾部零。
N 或 n 數字 數字轉換為“-d,ddd,ddd.ddd...”格式的字符串,其中每個“d”表示一個數字 (0-9)。如果該數字為負,則該字符串以減號開頭。小數點左邊每三個數字之間插入一個千位分隔符。精度說明符指示所需的小數位數。如果忽略精度說明符,則使用 NumberFormatInfo 給定的默認數值精度。
P 或 p 百分比 數字轉換為由 NumberFormatInfo.PercentNegativePattern 屬性或 NumberFormatInfo.PercentPositivePattern 屬性定義的、表示百分比的字符串。如果數字為負,則產生的字符串由 PercentNegativePattern 定義并以負號開頭。已轉換的數字乘以 100 以表示為百分比。精度說明符指示所需的小數位數。如果省略精度說明符,則使用 NumberFormatInfo 給定的默認數值精度。
R 或 r 往返過程 往返過程說明符保證轉換為字符串的數值再次被分析為相同的數值。使用此說明符格式化數值時,首先用常規格式測試:Double 使用 15 位精度,Single 使用 7 位精度。如果此值被成功地分析回相同的數值,則使用常規格式說明符對其進行格式化。但是,如果此值未被成功地分析為相同的數值,則它這樣格式化:Double 使用 17 位精度,Single 使用 9 位精度。雖然精度說明符可以追加到往返過程格式說明符,但它將被忽略。使用此說明符時,往返過程優先于精度。此格式僅受浮點型支持。
X 或 x 十六進制 數字轉換為十六進制數字的字符串。格式說明符的大小寫指示對大于 9 的十六進制數字使用大寫字符還是小寫字符。例如,使用“X”產生“ABCDEF”,使用“x”產生“abcdef”。精度說明符指示結果字符串中所需的最少數字個數。如果需要的話,則用零填充該數字的左側,以產生精度說明符給定的數字個數。只有整型才支持此格式。
如果標準數字格式說明符未提供所需的格式化類型,可以使用自定義格式字符串進一步增強字符串輸出。標準格式字符串包含一個字母字符,后面可能會跟有數字序列(形成一個 0 到 99 的值);而所有其他格式字符串都是自定義格式字符串。
下表顯示可以用于創建自定義數字格式字符串及其定義的字符。請注意,與當前線程關聯的 NumberFormatInfo 對象的“區域選項”控制面板的設置會影響這些字符中的某些所產生的輸出字符串。使用不同區域性的計算機將生成不同的輸出字符串。
格式字符值說明
0零占位符如果格式化的值在格式字符串中出現“0”的位置有一個數字,則此數字被復制到輸出字符串中。小數點前最左邊的“0”的位置和小數點后最右邊的“0”的位置確定總在輸出字符串中出現的數字范圍。“00”說明符使得值被舍入到小數點前最近的數字,其中零位總被舍去。例如,用“00”格式化 34.5 將得到值 35。
#數字占位符如果格式化的值在格式字符串中出現“#”的位置有一個數字,則此數字被復制到輸出字符串中。否則,輸出字符串中的此位置不存儲任何值。請注意,如果“0”不是有效數字,此說明符永不顯示“0”字符,即使“0”是字符串中唯一的數字。如果“0”是所顯示的數字中的有效數字,則顯示“0”字符。“##”格式字符串使得值被舍入到小數點前最近的數字,其中零總被舍去。例如,用“##”格式化 34.5 將得到值 35。
.小數點格式字符串中的第一個“.”字符確定格式化的值中的小數點分隔符的位置;任何其他“.”字符被忽略。用作小數點分隔符的實際字符由控制格式化的 NumberFormatInfo 的 NumberDecimalSeparator 屬性確定。
,千位分隔符和數字比例換算“,”字符有兩種用途。首先,如果格式字符串在小數點(如果有)左邊的兩個數字占位符(0 或 #)之間包含“,”字符,則輸出將在小數點分隔符左邊的每三個數字之間插入千位分隔符。輸出字符串中用作小數點分隔符的實際字符由控制格式化的當前 NumberFormatInfo 的 NumberGroupSeparator 屬性確定。
其次,如果格式字符串在緊鄰小數點的左側包含一個或多個“,”字符,則數字在格式化之前將被“,”字符數除然后乘以 1000。例如,格式字符串“0,,”將 100,000,000 簡單表示為 100。使用“,”字符指示比例換算在格式化數字中不包括千位分隔符。因此,若要將數字縮小 1,000,000 倍并插入千位分隔符,應使用格式字符串“#,##0,,”。
%百分比占位符在格式字符串中出現“%”字符將導致數字在格式化之前乘以 100。適當的符號插入到數字本身在格式字符串中出現“%”的位置。使用的百分比字符由當前的 NumberFormatInfo 類確定。
E0
E+0
E-0
e0
e+0
e-0科學計數法如果“E”、“E+”、“E-”、“e”、“e+”或“e-”中的任何一個字符串出現在格式字符串中,而且后面緊跟至少一個“0”字符,則數字用科學計數法來格式化,在數字和指數之間插入“E”或“e”。跟在科學計數法指示符后面的“0”字符數確定指數輸出的最小位數。“E+”和“e+”格式指示符號字符(正號或負號)應總是置于指數前面。“E”、“E-”、“e”或“e-”格式指示符號字符僅置于負指數前面。
\轉義符在 C# 和 C++ 的托管擴展中,反斜杠字符使格式字符串中的下一個字符被解釋為轉義序列。它與傳統的格式化序列一起使用,如“\n”(換行)。
在某些語言中,轉義符本身用作文本時必須跟在轉義符之后。否則,編譯器將該字符理解為轉義符。使用字符串“\\”顯示“\”。
請注意,Visual Basic 中不支持此轉義符,但是 ControlChars 提供相同的功能。
'ABC'
"ABC"字符串引在單引號或雙引號中的字符被原樣復制到輸出字符串中,而且不影響格式化。
;部分分隔符“;”字符用于分隔格式字符串中的正數、負數和零各部分。
其他所有其他字符所有其他字符以文本形式復制到輸出字符串中它們出現的位置。
請注意,對于固定點格式字符串(不包含“E0”、“E+0”、“E-0”、“e0”、“e+0”或“e-0”的字符串),數字被舍入為與小數點右邊的數字占位符數目相同的小數位數。如果格式字符串不包含小數點,數字被舍入為最接近的整數。如果數字位數多于小數點左邊數字占位符的個數,多余的數字被復制到輸出字符串中緊挨著第一個數字占位符的前面。
可以根據值為正、為負還是為零來為字符串應用不同的格式化。為產生這種行為,自定義格式字符串可以包含最多三個用分號分隔的部分:
一個部分:格式字符串應用于所有值。
兩個部分:第一部分應用于正值和零,第二部分應用于負值。如果要格式化的數字為負,但根據第二部分中的格式舍入后為零,則最終的零根據第一部分進行格式化。
三個部分:第一部分應用于正值,第二部分應用于負值,第三部分應用于零。第二部分可能為空(分號間沒有任何內容),在這種情況下,第一部分應用于所有非零值。如果要格式化的數字為非零值,但根據第一部分或第二部分中的格式舍入后為零,則最終的零根據第三部分進行格式化。
格式化最終值時,此類型的格式化忽略所有先前存在的與數字關聯的格式化。例如,使用部分分隔符時,顯示的負值永遠不帶負號。如果您希望格式化后的最終值帶有負號,則應明確包含負號,讓它作為自定義格式說明符的組成部分。
原文出處:http://hi.baidu.com/20794027/blog/item/1b108960a2145142ebf8f800.html
?
總結
以上是生活随笔為你收集整理的使用String.format简化代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求伯君:向暴雪学习 金山不求一夜暴富
- 下一篇: 网页中Javascript代码的应用方式