Console.WriteLine()函數的格式一直沒怎麼注意。今天同事問起Console.WriteLine({0:D3},a)的意義,突然發現不知道D表明什麼意義。之前覺得{0,4}是指第一個變量輸出時佔8位,今天查了一下,發現也並不徹底正確。html
其中格式項都採用以下形式:git
{index[,alignment][:formatString]} 數組
其中"index"指索引佔位符,這個確定都知道;ide
",alignment"按字面意思顯然是對齊方式,以","爲標記;函數
":formatString"就是對輸出格式的限定,以":"爲標記。post
alignment:可選,是一個帶符號的整數,指示首選的格式化字段寬度。若是「對齊」值小於格式化字符串的長度,「對齊」會被忽略,而且使用格式化字符串的長度做爲字段寬度。若是「對齊」爲正數,字段的格式化數據爲右對齊;若是「對齊」爲負數,字段的格式化數據爲左對齊。若是須要填充,則使用空白。若是指定「對齊」,就須要使用逗號。測試
formatString:由標準或自定義格式說明符組成.spa
下表是從網上得來:操作系統
字符.net |
說明 |
示例 |
輸出 |
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 |
Specifier |
Type |
Format |
Output (Passed Double 1.42) |
Output (Passed Int -12400) |
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 |
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 |
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 |
CSDN中例子:
- string myFName = "Fred";
- string myLName = "Opals";
- int myInt = 100;
- string FormatFName = String.Format("First Name = |{0,10}|", myFName);
- string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
- string FormatPrice = String.Format("Price = |{0,10:C}|", myInt);
- Console.WriteLine(FormatFName);
- Console.WriteLine(FormatLName);
- Console.WriteLine(FormatPrice);
-
- FormatFName = String.Format("First Name = |{0,-10}|", myFName);
- FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
- FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
- Console.WriteLine(FormatFName);
- Console.WriteLine(FormatLName);
- Console.WriteLine(FormatPrice);
-
-
String 用法::
這種寫法用過沒:string.Format("{0,-10}", 8)
www.cnblogs.com 2011-08-03 18:46
作 .net 開發也若干年了,如此寫法(下面代碼中黃色高亮部分)確是我第一次見(更別提用了):
1 2 3 4 |
var s1 = string.Format("{0,-10}", 8); var s2 = string.Format("{0,10}", 8); var s3 = string.Format("{0,20:yyyy-MM-dd}", DateTime.Today); var s4 = string.Format("4G 內存便宜了{0,12:C2},我打算買{1,4}條", 145, 2) |
大括號中,索引後 分號前,有一個逗號和一個整數(減號表示負數)。
會格式化成爲何樣子呢?看下調試截圖吧:
從上圖中能大體看出此端倪,沒錯:
tring.Format("{0,-10}", 8) 等同於 string.Format("{0}", 8).PadRight(10);
tring.Format("{0,10}", 8) 等同於 string.Format("{0}", 8).PadLeft(10)。
String.Format 方法 format 參數由零或多個文本序列與零或多個索引佔位符混合組成,其中索引佔位符稱爲格式項,對應於與此方法的參數列表中的對象。 格式設置過程將每一個格式項替換爲相應對象值的字符串表示形式。
格式項的語法以下:
{index[,length][:formatString]}
方括號中的元素是可選的。 下表描述每一個元素。 有關複合格式設置功能(包括格式項的語法)的更多信息,請參見複合格式。
元素 |
說明 |
索引 |
要設置格式的對象的參數列表中的位置(從零開始)。 若是由 index 指定的對象爲 null,則格式項將被 String.Empty 替換。 因爲該重載在其參數列表中只有單個對象,index 的值必須始終爲 0。 若是 index 位置沒有參數,將引起 FormatException。 |
,length |
參數的字符串表示形式中包含的最小字符數。 若是該值是正的,則參數右對齊;若是該值是負的,則參數左對齊。 |
:formatString |
要設置格式的對象支持的標準或自定義格式字符串。 formatString 的可能值與該對象的 ToString(format) 方法支持的值相同。 若是沒有指定 formatString,而且要設置格式的對象實現了 IFormattable 接口,則將傳遞 null 做爲用做 IFormattable.ToString 格式字符串的 format 參數的值。 |
元素
說明
索引
,length
參數的字符串表示形式中包含的最小字符數。 若是該值是正的,則參數右對齊;若是該值是負的,則參數左對齊。
:formatString
MSDN 原文連接:Format 方法 (String, Object)
,length 其實把 String.PadLeft 和 String.PadRight 的功能融合在的 String.Format 方法中,簡化了代碼的編寫。
若是沒有這種格式,代碼寫起來麻煩多了:
1 2 3 |
var s5 = string.Format("4G 內存便宜了{0},我打算買{1}條", 145.ToString("C2").PadLeft(12), 2.ToString().PadLeft(4)) |
看起來不直觀,複雜,如文首代碼中的 「我打算買{1,4}條」。
實際使用少,沒用過的看了很納悶。
前言
若是你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串類,那麼你對String.Format方法確定很熟悉。在C#中也常用這個方法來格式化字符串,好比下面這樣:
int x = 16; decimal y = 3.57m; string h = String.Format( "item {0} sells at {1:C}", x, y ); Console.WriteLine(h)
在個人機器上,能夠獲得下面的輸出:
item 16 sells at ¥3.57
也許你的機器上的輸出和這個不太同樣。這是正常的,本文稍後就會解釋這個問題。
在咱們平常使用中,更多的是使用Console.WriteLine方法來輸出一個字符串。其實String.Format和Console.WriteLine有不少共同點。兩個方法都有不少重載的格式而且採用無固定參數的對象數組做爲最後一個參數。下面的兩個語句會產生一樣的輸出。
Console.WriteLine( "Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8'); string u = String.Format("Hello {0} {1} {2} {3} {4} {5} {6} {7} {8}", 123, 45.67, true, 'Q', 4, 5, 6, 7, '8'); Console.WriteLine(u)
輸出以下:
Hello 123 45.67 True Q 4 5 6 7 8 Hello 123 45.67 True Q 4 5 6 7 8
2 字符串格式
String.Format和WriteLine都遵照一樣的格式化規則。格式化的格式以下:"{ N [, M ][: formatString ]}", arg1, ... argN,在這個格式中:
1) N是從0開始的整數,表示要格式化的參數的個數
2) M是一個可選的整數,表示格式化後的參數所佔的寬度,若是M是負數,那麼格式化後的值就是左對齊的,若是M是正數,那麼格式化後的值是右對齊的
3) formatString是另一個可選的參數,表示格式代碼
argN表示要格式化的表達式,和N是對應的。
若是argN是空值,那麼就用一個空字符串來代替。若是沒有formatString,那麼就用參數N對應的ToString方法來格式化。下面的語句會產生一樣的輸出:
ublic class TestConsoleApp { public static void Main(string[] args) { Console.WriteLine(123); Console.WriteLine("{0}", 123); Console.WriteLine("{0:D3}", 123); } }
輸出是:
123 123 123
也能夠經過String.Format獲得一樣的輸出。
tring s = string.Format("123"); string t = string.Format("{0}", 123); string u = string.Format("{0:D3}", 123); Console.WriteLine(s); Console.WriteLine(t); Console.WriteLine(u)
所以有以下結論:
(,M)決定了格式化字符串的寬度和對齊方向
(:formatString)決定了如何格式化數據,好比用貨幣符號,科學計數法或者16進制。就像下面這樣:
Console.WriteLine("{0,5} {1,5}", 123, 456); // 右對齊 Console.WriteLine("{0,-5} {1,-5}", 123, 456); // 左對齊
輸出是
123 456 123 456
也能夠合併這些表達式,先放一個逗號,再放一個冒號。就像這樣:
Console.WriteLine("{0,-10:D6} {1,-10:D6}", 123, 456)
輸出是:
000123
000456
咱們能夠用這種格式化特性來對齊咱們的輸出。
Console.WriteLine("\n{0,-10}{1,-3}", "Name","Salary"); Console.WriteLine("----------------"); Console.WriteLine("{0,-10}{1,6}", "Bill", 123456); Console.WriteLine("{0,-10}{1,6}", "Polly", 7890)
輸出是:
Name Salary ---------------- Bill 123456 Polly 7890
3 格式化標識符
標準的數學格式字符串用於返回一般使用的字符串。它們一般象X0這樣的格式。X是格式化標識符,0是精度標識符。格式標識符號共有9種,它們表明了大多數經常使用的數字格式。就像下表所示:
字母 |
含義 |
C或c |
Currency 貨幣格式 |
D或d |
Decimal 十進制格式(十進制整數,不要和.Net的Decimal數據類型混淆了) |
E或e |
Exponent 指數格式 |
F或f |
Fixed point 固定精度格式 |
G或g |
General 經常使用格式 |
N或 |
用逗號分割千位的數字,好比1234將會被變成1,234 |
P或 |
Percentage 百分符號格式 |
R或r |
Round-trip 圓整(只用於浮點數)保證一個數字被轉化成字符串之後能夠再被轉回成一樣的數字 |
X或x |
Hex 16進制格式 |
若是咱們使用下面的表達方式,讓咱們看看會發生什麼
ublic class FormatSpecApp { public static void Main(string[] args) { int i = 123456; Console.WriteLine("{0:C}", i); // ¥123,456.00 Console.WriteLine("{0:D}", i); // 123456 Console.WriteLine("{0:E}", i); // 1.234560E+005 Console.WriteLine("{0:F}", i); // 123456.00 Console.WriteLine("{0:G}", i); // 123456 Console.WriteLine("{0:N}", i); // 123,456.00 Console.WriteLine("{0:P}", i); // 12,345,600.00 % Console.WriteLine("{0:X}", i); // 1E240 } }
精度控制標識控制了有效數字的個數或者十進制數小數的位數。
R(圓整)格式僅僅對浮點數有效。這個值首先會用通用格式來格式化。對於雙精度數有15位精度,對於單精度數有7位精度。若是這個值能夠被正確地解析回原始的數字,就會用通用格式符來格式化。若是不能解析回去的話,那麼就會用17位精度來格式化雙精度數,用9位精度來格式化單精度數。儘管咱們能夠在圓整標識符後面添加有效數字的位數,可是它會被忽略掉。
double d = 1.2345678901234567890; Console.WriteLine("Floating-Point:\t{0:F16}", d); // 1.2345678901234600 Console.WriteLine("Roundtrip:\t{0:R16}", d); // 1.2345678901234567
若是標準格式化標識符還不能知足你。你可使用圖形化格式字符串來建立定製的字符串輸出。圖形化格式化使用佔位符來表示最小位數,
最大位數,定位符號,負號的外觀以及其它數字符號的外觀。就像下表所示
符號 |
名稱 |
含義 |
0 |
0佔位符 |
用0填充不足的位數 |
# |
數字佔位符 |
用#代替實際的位數 |
. |
十進制小數點 |
|
, |
千位分隔符 |
用逗號進行千位分割,好比把1000分割成1,000 |
% |
百分符號 |
顯示一個百分標識 |
E+0 E-0 e+0 e-0 |
指數符號 |
用指數符號格式化輸出 |
\ |
專注字符 |
用於傳統格式的格式化序列,好比"\n"(新行) |
'ABC' "ABC" |
常量字符串 |
顯示單引號或者雙引號裏面的字符串 |
|
區域分隔符 |
若是數字會被格式化成整數,負數,或者0,用;來進行分隔 |
,. |
縮放符號 |
數字除以1000 |
看下面的例子:
double i = 123456.42; Console.WriteLine(); Console.WriteLine("{0:000000.00}", i); //123456.42 Console.WriteLine("{0:00.00000000e+0}", i); //12.34564200e+4 Console.WriteLine("{0:0,.}", i); //123 Console.WriteLine("{0:#0.000}", i); // 123456.420 Console.WriteLine("{0:#0.000;(#0.000)}", i); // 123456.420 Console.WriteLine("{0:#0.000;(#0.000);<zero>}", i); // 123456.420 Console.WriteLine("{0:#%}", i); // 12345642% i = -123456.42; Console.WriteLine(); Console.WriteLine("{0:000000.00}", i); //-123456.42 Console.WriteLine("{0:00.00000000e+0}", i); //-12.34564200e+4 Console.WriteLine("{0:0,.}", i); //-123 Console.WriteLine("{0:#0.000}", i); // -123456.420 Console.WriteLine("{0:#0.000;(#0.000)}", i); // (123456.420) Console.WriteLine("{0:#0;(#0);<zero>}", i); // (123456) Console.WriteLine("{0:#%}", i); // -12345642% i = 0; Console.WriteLine(); Console.WriteLine("{0:0,.}", i); //0 Console.WriteLine("{0:#0}", i); // 0 Console.WriteLine("{0:#0;(#0)}", i); // 0 Console.WriteLine("{0:#0;(#0);<zero>}", i); // <zero> Console.WriteLine("{0:#%}", i); // %
4 數字字符串的解析
全部的基礎類型都有ToString方法,它是從object類型中繼承過來的。全部的數值類型都有Parse方法,它用字符串爲參數,而且返回相等的數值。好比
ublic class NumParsingApp { public static void Main(string[] args) { int i = int.Parse("12345"); Console.WriteLine("i = {0}", i); int j = Int32.Parse("12345"); Console.WriteLine("j = {0}", j); double d = Double.Parse("1.2345E+6"); Console.WriteLine("d = {0:F}", d); string s = i.ToString(); Console.WriteLine("s = {0}", s); } }
輸出以下
i = 12345 j = 12345 d = 1234500.00 s = 12345
在缺省情況下,某些非數字字符是能夠存在的。好比開頭和結尾的空白。逗號和小數點,加號和減號,所以,下面的Parse語句是同樣的
tring t = " -1,234,567.890 "; //double g = double.Parse(t); // 和下面的代碼幹一樣的事情 double g = double.Parse(t, NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite); Console.WriteLine("g = {0:F}", g)
輸出都是這樣
g = -1234567.89
注意到,若是你要使用NumberStyles,就要添加對System.Globalization的引用,而後就可使用不一樣NumberStyles的組合或者其中的任意一種。若是你想兼容貨幣符號,就須要使用重載的Parse方法,它們採用了NumberFormatInfo對象做爲一個參數,而後你能夠設置NumberFormatInfo的CurrencySymbol屬性來調用Parse方法,好比:
上面的代碼有以下輸出
h = -1234567.89
除了NumberFormatInfo,還可使用CultureInfo類。CultureInfo表明了某種特定的文化,包括文化的名字,書寫的方式,日曆的格式。對於某種特定文化的操做是很是廣泛的狀況,好比格式化日期和排序。文化的命名方式聽從RFC1766標準,使用<語言代碼2>-<國家/地區碼2>的方式,其中的<語言代碼2>是兩個小寫的字母,它們來自ISO639-1;<國家/地區碼2>是兩個大寫字母,它們來自ISO3166。好比,美國英語是「en-US"。英國英語是"en-GB"。特立尼達和多巴哥英語是"en-TT"。例如,咱們能夠建立一個美國英語的CultureInfo對象而且基於這種文化將數字轉換成字符串。
int k = 12345; CultureInfo us = new CultureInfo("en-US"); string v = k.ToString("c", us); Console.WriteLine(v)
輸出是:
$12,345.00
要注意到,咱們使用了重載的ToString方法,它把第一個格式化字符串當成第一個參數,將一個CultureInfo對象(執行了IFormatProvider對象)做爲第二個參數。這兒有第二個例子,對於丹麥人來講:
CultureInfo dk = new CultureInfo("da-DK"); string w = k.ToString("c", dk); Console.WriteLine(w)
輸出是:
kr 12.345,00
5 字符串和日期
一個日期對象有個叫Ticks的屬性。它存儲了自從公元1年的1月1號上午12點開始的,以100納秒爲間隔的時間。好比,Ticks值等於31241376000000000L表示公元100年,星期五,1月1號,上午12點這一時間。Ticks老是以100納秒爲間隔遞增。
DateTime的值以存儲在DateTimeFormatInfo實例裏面的標準或者自定義的方式來表示。爲了修改一個日期顯示的方式,DateTimeFormatInfo實例必需要是可寫的,以便咱們寫入自定義的格式而且存入屬性中
using System.Globalization; public class DatesApp { public static void Main(string[] args) { DateTime dt = DateTime.Now; Console.WriteLine(dt); Console.WriteLine("date = {0}, time = {1}\n", dt.Date, dt.TimeOfDay); } }
代碼會產生下面的輸出
23/06/2001 17:55:10 date = 23/06/2001 00:00:00, time = 17:55:10.3839296
下表列出了標準的格式字符串以及相關的DateTimeFormatInfo屬性
D |
|
|
D |
MM/dd/yyyy |
ShortDatePattern(短日期模式) |
D |
dddd,MMMM dd,yyyy |
LongDatePattern(長日期模式) |
F |
dddd,MMMM dd,yyyy HH:mm |
Full date and time (long date and short time)(全日期和時間模式) |
F |
dddd,MMMM dd,yyyy HH:mm: |
FullDateTimePattern (long date and long time)(長日期和長時間) |
G |
MM/dd/yyyy HH:mm |
General (short date and short time)(通用模式,短日期和短期) |
G |
MM/dd/yyyy HH:mm: |
General (short date and long time)(通用模式,短日期和長時間) |
M,M |
MMMM dd |
MonthDayPattern(月天模式) |
r,R |
ddd,dd MMM yyyy,HH':'mm':'ss 'GMT' |
RFC1123Pattern (RFC1123模式) |
S |
yyyy-MM-dd HH:mm: |
SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地時間的可排序模式) |
T |
HH:mm |
ShortTimePattern (短期模式) |
T |
HH:mm: |
LongTimePattern(長時間模式) |
U |
yyyy-MM-dd HH:mm: |
UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式) |
U |
dddd,MMMM dd,yyyy,HH:mm: |
UniversalSortable-DateTimePattern(通用可排序模式) |
y,Y |
MMMM,yyyy |
YearMonthPattern(年月模式) |
DateTimeFormatInfo.InvariantInfo屬性獲得了默認的只讀的DateTimeFormatInfo實例,它與文化無關。你能夠建立自定義的模式。要注意到的是InvariantInfo不必定和本地的格式同樣。Invariant等於美國格式。另外,若是你向DateTime.Format方法傳遞的第二個參數是null,DateTimeFormatInfo將會是默認的CurrentInfo。好比
Console.WriteLine(dt.ToString("d", dtfi)); Console.WriteLine(dt.ToString("d", null)); Console.WriteLine()
輸出是
06/23/2001 23/06/2001
對比選擇InvariantInfo和CurrentInfo的。
DateTimeFormatInfo dtfi; Console.Write("[I]nvariant or [C]urrent Info?: "); if (Console.Read() == 'I') dtfi = DateTimeFormatInfo.InvariantInfo; else dtfi = DateTimeFormatInfo.CurrentInfo; DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantInfo; Console.WriteLine(dt.ToString("D", dtfi)); Console.WriteLine(dt.ToString("f", dtfi)); Console.WriteLine(dt.ToString("F", dtfi)); Console.WriteLine(dt.ToString("g", dtfi)); Console.WriteLine(dt.ToString("G", dtfi)); Console.WriteLine(dt.ToString("m", dtfi)); Console.WriteLine(dt.ToString("r", dtfi)); Console.WriteLine(dt.ToString("s", dtfi)); Console.WriteLine(dt.ToString("t", dtfi)); Console.WriteLine(dt.ToString("T", dtfi)); Console.WriteLine(dt.ToString("u", dtfi)); Console.WriteLine(dt.ToString("U", dtfi)); Console.WriteLine(dt.ToString("d", dtfi)); Console.WriteLine(dt.ToString("y", dtfi)); Console.WriteLine(dt.ToString("dd-MMM-yy", dtfi))
輸出是
[I]nvariant or [C]urrent Info?: I 01/03/2002 03/01/2002 Thursday, 03 January 2002 Thursday, 03 January 2002 12:55 Thursday, 03 January 2002 12:55:03 01/03/2002 12:55 01/03/2002 12:55:03 January 03 Thu, 03 Jan 2002 12:55:03 GMT 2002-01-03T12:55:03 12:55 12:55:03 2002-01-03 12:55:03Z Thursday, 03 January 2002 12:55:03 01/03/2002 2002 January 03-Jan-02 [I]nvariant or [C]urrent Info?: C 03/01/2002 03/01/2002 03 January 2002 03 January 2002 12:55 03 January 2002 12:55:47 03/01/2002 12:55 03/01/2002 12:55:47 03 January Thu, 03 Jan 2002 12:55:47 GMT 2002-01-03T12:55:47 12:55 12:55:47 2002-01-03 12:55:47Z 03 January 2002 12:55:47 03/01/2002 January 2002 03-Jan-02
/******************************************************************************************
*【Author】:flyingbread
*【Date】:2007年1月18日
*【Notice】:
*一、本文爲原創技術文章,首發博客園我的站點(
http://flyingbread.cnblogs.com/
變量.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%
string.Format 格式化時間,貨幣
一、格式化貨幣(跟系統的環境有關,中文系統默認格式化人民幣,英文系統格式化美圓)
string.Format("{0:C}",0.2) 結果爲:¥0.20 (英文操做系統結果:$0.20)
默認格式化小數點後面保留兩位小數,若是須要保留一位或者更多,能夠指定位數 string.Format("{0:C1}",23.15) 結果爲:¥23.2 (截取會自動四捨五入)
格式化多個Object實例 string.Format("市場價:{0:C},優惠價{1:C}",23.15,19.82)
二、格式化十進制的數字(格式化成固定的位數,位數不能少於未格式化前,只支持×××)
string.Format("{0:D3}",23) 結果爲:023
string.Format("{0:D2}",1223) 結果爲:1223,(精度說明符指示結果字符串中所需的最少數字個數。)
三、用分號隔開的數字,並指定小數點後的位數
string.Format("{0:N}", 14200) 結果爲:14,200.00 (默認爲小數點後面兩位)
string.Format("{0:N3}", 14200.2458) 結果爲:14,200.246 (自動四捨五入)
四、格式化百分比
string.Format("{0:P}", 0.24583) 結果爲:24.58% (默認保留百分的兩位小數)
string.Format("{0:P1}", 0.24583) 結果爲:24.6% (自動四捨五入)
五、零佔位符和數字佔位符
string.Format("{0:0000.00}", 12394.039) 結果爲:12394.04
string.Format("{0:0000.00}", 194.039) 結果爲:0194.04
string.Format("{0:###.##}", 12394.039) 結果爲:12394.04
string.Format("{0:####.#}", 194.039) 結果爲:194
下面的這段說明比較難理解,多測試一下實際的應用就能夠明白了。 零佔位符: 若是格式化的值在格式字符串中出現「0」的位置有一個數字,則此數字被複制到結果字符串中。小數點前最左邊的「0」的位置和小數點後最右邊的「0」的位置肯定總在結果字符串中出現的數字範圍。 「00」說明符使得值被舍入到小數點前最近的數字,其中零位總被捨去。
數字佔位符: 若是格式化的值在格式字符串中出現「#」的位置有一個數字,則此數字被複制到結果字符串中。不然,結果字符串中的此位置不存儲任何值。 請注意,若是「0」不是有效數字,此說明符永不顯示「0」字符,即便「0」是字符串中惟一的數字。若是「0」是所顯示的數字中的有效數字,則顯示「0」字符。 「##」格式字符串使得值被舍入到小數點前最近的數字,其中零總被捨去。
六、日期格式化
string.Format("{0:d}",System.DateTime.Now) 結果爲:2009-3-20 (月份位置不是03)
string.Format("{0:D}",System.DateTime.Now) 結果爲:2009年3月20日
string.Format("{0:f}",System.DateTime.Now) 結果爲:2009年3月20日 15:37
string.Format("{0:F}",System.DateTime.Now) 結果爲:2009年3月20日 15:37:52
string.Format("{0:g}",System.DateTime.Now) 結果爲:2009-3-20 15:38
string.Format("{0:G}",System.DateTime.Now) 結果爲:2009-3-20 15:39:27
string.Format("{0:m}",System.DateTime.Now) 結果爲:3月20日
string.Format("{0:t}",System.DateTime.Now) 結果爲:15:41
string.Format("{0:T}",System.DateTime.Now) 結果爲:15:41:50
更詳細的說明請下面微軟對此的說明或者上msdn上查詢。
微軟MSDN對string.format的方法說明:
名稱 說明 String.Format (String, Object) 將指定的 String 中的格式項替換爲指定的 Object 實例的值的文本等效項。 String.Format (String, Object[]) 將指定 String 中的格式項替換爲指定數組中相應 Object 實例的值的文本等效項。 String.Format (IFormatProvider, String, Object[]) 將指定 String 中的格式項替換爲指定數組中相應 Object 實例的值的文本等效項。指定的參數提供區域性特定的格式設置信息。 String.Format (String, Object, Object) 將指定的 String 中的格式項替換爲兩個指定的 Object 實例的值的文本等效項。 String.Format (String, Object, Object, Object) 將指定的 String 中的格式項替換爲三個指定的 Object 實例的值的文本等效項。
標準數字格式字符串
格式說明符 名稱 說明 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 並且小於精度說明符,則使用定點表示法;不然使用科學記數法。若是要求有小數點,而且忽略尾部零,則結果包含小數點。若是精度說明符存在,而且結果的有效數字位數超過指定精度,則經過舍入刪除多餘的尾部數字。
上述規則有一個例外:若是數字是 Decimal 並且省略精度說明符時。在這種狀況下總使用定點表示法並保留尾部零。
使用科學記數法時,若是格式說明符是「G」,結果的指數帶前綴「E」;若是格式說明符是「g」,結果的指數帶前綴「e」。
N 或 n 數字 數字轉換爲「-d,ddd,ddd.ddd…」形式的字符串,其中「-」表示負數符號(若是須要),「d」表示數字 (0-9),「,」表示數字組之間的千位分隔符,「.」表示小數點符號。實際的負數模式、數字組大小、千位分隔符以及十進制分隔符由當前 NumberFormatInfo 對象指定。
精度說明符指示所需的小數位數。若是忽略精度說明符,則使用當前 NumberFormatInfo 對象給定的默認數值精度。
P 或 p 百分比 數字轉換爲由 NumberFormatInfo.PercentNegativePattern 或 NumberFormatInfo.PercentPositivePattern 屬性定義的、表示百分比的字符串,前者用於數字爲負的狀況,後者用於數字爲正的狀況。已轉換的數字乘以 100 以表示爲百分比。
精度說明符指示所需的小數位數。若是忽略精度說明符,則使用當前 NumberFormatInfo 對象給定的默認數值精度。
R 或 r 往返過程 只有 Single 和 Double 類型支持此格式。往返過程說明符保證轉換爲字符串的數值再次被分析爲相同的數值。使用此說明符格式化數值時,首先使用常規格式對其進行測試:Double 使用 15 位精度,Single 使用 7 位精度。若是此值被成功地分析回相同的數值,則使用常規格式說明符對其進行格式化。可是,若是此值未被成功地分析爲相同數值,則它這樣格式化:Double 使用 17 位精度,Single 使用 9 位精度。
雖然此處能夠存在精度說明符,但它將被忽略。使用此說明符時,往返過程優先於精度。 X 或 x 十六進制數 只有整型才支持此格式。數字轉換爲十六進制數字的字符串。格式說明符的大小寫指示對大於 9 的十六進制數字使用大寫字符仍是小寫字符。例如,使用「X」產生「ABCDEF」,使用「x」產生「abcdef」。