日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】C#格式化字符串

發(fā)布時間:2025/3/18 C# 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】C#格式化字符串 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 前言

???如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard Template Library(STL)的字符串類,那么你對String.Format方法肯定很熟悉。在C#中也經常使用這個方法來格式化字符串,比如下面這樣:

intx?=16;
decimaly?=3.57m;
stringh?=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有很多共同點。兩個方法都有很多重載的格式并且采用無固定參數(shù)的對象數(shù)組作為最后一個參數(shù)。下面的兩個語句會產生同樣的輸出。

Console.WriteLine(?"Hello?{0}?{1}?{2}?{3}?{4}?{5}?{6}?{7}?{8}",?123,?45.67,?true,?'Q',?4,?5,?6,?7,?'8');
stringu?=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都遵守同樣的格式化規(guī)則。格式化的格式如下:"{ N [, M ][: formatString ]}", arg1, ... argN,在這個格式中:

1) N是從0開始的整數(shù),表示要格式化的參數(shù)的個數(shù)

2) M是一個可選的整數(shù),表示格式化后的參數(shù)所占的寬度,如果M是負數(shù),那么格式化后的值就是左對齊的,如果M是正數(shù),那么格式化后的值是右對齊的

3) formatString是另外一個可選的參數(shù),表示格式代碼

argN表示要格式化的表達式,和N是對應的。

如果argN是空值,那么就用一個空字符串來代替。如果沒有formatString,那么就用參數(shù)N對應的ToString方法來格式化。下面的語句會產生同樣的輸出:

publicclassTestConsoleApp
{
????publicstaticvoidMain(string[]?args)
????{
????????Console.WriteLine(123);
????????Console.WriteLine("{0}",?123);
????????Console.WriteLine("{0:D3}",?123);
????}
}


輸出是:

123
123
123


也可以通過String.Format得到同樣的輸出。

strings?=string.Format("123");
stringt?=string.Format("{0}",?123);
stringu?=string.Format("{0:D3}",?123);
Console.WriteLine(s);
Console.WriteLine(t);
Console.WriteLine(u);


因此有如下結論:

(,M)決定了格式化字符串的寬度和對齊方向

(:formatString)決定了如何格式化數(shù)據,比如用貨幣符號,科學計數(shù)法或者16進制。就像下面這樣:

Console.WriteLine("{0,5}?{1,5}",?123,?456);??????//右對齊
Console.WriteLine("{0,-5}?{1,-5}",?123,?456);????//左對齊


輸出是

123456
123456


也可以合并這些表達式,先放一個逗號,再放一個冒號。就像這樣:

Console.WriteLine("{0,-10:D6}?{1,-10:D6}",?123,?456);


輸出是:

000123000456


我們可以用這種格式化特性來對齊我們的輸出。

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 格式化標識符

標準的數(shù)學格式字符串用于返回通常使用的字符串。它們通常象X0這樣的格式。X是格式化標識符,0是精度標識符。格式標識符號共有9種,它們代表了大多數(shù)常用的數(shù)字格式。就像下表所示:

字母?含義
C或cCurrency 貨幣格式
D或dDecimal 十進制格式(十進制整數(shù),不要和.Net的Decimal數(shù)據類型混淆了)
E或eExponent 指數(shù)格式
F或fFixed point 固定精度格式
G或gGeneral 常用格式
N或n用逗號分割千位的數(shù)字,比如1234將會被變成1,234
P或pPercentage 百分符號格式
R或rRound-trip? 圓整(只用于浮點數(shù))保證一個數(shù)字被轉化成字符串以后可以再被轉回成同樣的數(shù)字
X或xHex 16進制格式


如果我們使用下面的表達方式,讓我們看看會發(fā)生什么

publicclassFormatSpecApp
{
????publicstaticvoidMain(string[]?args)
????{
????????inti?=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
}
}


精度控制標識控制了有效數(shù)字的個數(shù)或者十進制數(shù)小數(shù)的位數(shù)。

Console.WriteLine("{0:C5}",?i);?//¥123,456.00
Console.WriteLine("{0:D5}",?i);?//123456
Console.WriteLine("{0:E5}",?i);?//1.23456E+005
Console.WriteLine("{0:F5}",?i);?//123456.00000
Console.WriteLine("{0:G5}",?i);?//1.23456E5
Console.WriteLine("{0:N5}",?i);?//123,456.00000
Console.WriteLine("{0:P5}",?i);?//12,345,600.00000?%
Console.WriteLine("{0:X5}",?i);?//1E240


R(圓整)格式僅僅對浮點數(shù)有效。這個值首先會用通用格式來格式化。對于雙精度數(shù)有15位精度,對于單精度數(shù)有7位精度。如果這個值可以被正確地解析回原始的數(shù)字,就會用通用格式符來格式化。如果不能解析回去的話,那么就會用17位精度來格式化雙精度數(shù),用9位精度來格式化單精度數(shù)。盡管我們可以在圓整標識符后面添加有效數(shù)字的位數(shù),但是它會被忽略掉。

doubled?=1.2345678901234567890;
Console.WriteLine("Floating-Point:\t{0:F16}",?d);??//1.2345678901234600
Console.WriteLine("Roundtrip:\t{0:R16}",?d);???????//1.2345678901234567


如果標準格式化標識符還不能滿足你。你可以使用圖形化格式字符串來創(chuàng)建定制的字符串輸出。圖形化格式化使用占位符來表示最小位數(shù),

最大位數(shù),定位符號,負號的外觀以及其它數(shù)字符號的外觀。就像下表所示

?符號名稱含義
00占位符用0填充不足的位數(shù)
#數(shù)字占位符用#代替實際的位數(shù)
.十進制小數(shù)點?
,千位分隔符用逗號進行千位分割,比如把1000分割成1,000
%百分符號顯示一個百分標識
E+0
E-0
e+0
e-0
指數(shù)符號用指數(shù)符號格式化輸出
\專一字符用于傳統(tǒng)格式的格式化序列,比如"\n"(新行)
'ABC'
"ABC"
常量字符串?顯示單引號或者雙引號里面的字符串
;區(qū)域分隔符?如果數(shù)字會被格式化成整數(shù),負數(shù),或者0,用;來進行分隔
,.縮放符號數(shù)字除以1000


看下面的例子:

doublei?=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 數(shù)字字符串的解析

所有的基礎類型都有ToString方法,它是從object類型中繼承過來的。所有的數(shù)值類型都有Parse方法,它用字符串為參數(shù),并且返回相等的數(shù)值。比如

publicclassNumParsingApp
{
????publicstaticvoidMain(string[]?args)
????{
????????inti?=int.Parse("12345");
????????Console.WriteLine("i?=?{0}",?i);

????????intj?=Int32.Parse("12345");
????????Console.WriteLine("j?=?{0}",?j);

????????doubled?=Double.Parse("1.2345E+6");
????????Console.WriteLine("d?=?{0:F}",?d);

????????strings?=i.ToString();
????????Console.WriteLine("s?=?{0}",?s);
????}
}


輸出如下

i?=12345
j?=12345
d?=1234500.00
s?=12345


在缺省狀況下,某些非數(shù)字字符是可以存在的。比如開頭和結尾的空白。逗號和小數(shù)點,加號和減號,因此,下面的Parse語句是一樣的

stringt?="-1,234,567.890??";
//double?g?=?double.Parse(t);????????//和下面的代碼干同樣的事情
doubleg?=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對象作為一個參數(shù),然后你可以設置NumberFormatInfo的CurrencySymbol屬性來調用Parse方法,比如:

stringu?="¥-1,234,567.890??";
NumberFormatInfo?ni?=newNumberFormatInfo();
ni.CurrencySymbol?="¥";
doubleh?=Double.Parse(u,?NumberStyles.Any,?ni);
Console.WriteLine("h?=?{0:F}",?h);


上面的代碼有如下輸出

h?=-1234567.89


除了NumberFormatInfo,還可以使用CultureInfo類。CultureInfo代表了某種特定的文化,包括文化的名字,書寫的方式,日歷的格式。對于某種特定文化的操作是非常普遍的情況,比如格式化日期和排序。文化的命名方式遵從RFC1766標準,使用<語言代碼2>-<國家/地區(qū)碼2>的方式,其中的<語言代碼2>是兩個小寫的字母,它們來自ISO639-1;<國家/地區(qū)碼2>是兩個大寫字母,它們來自ISO3166。比如,美國英語是“en-US"。英國英語是"en-GB"。特立尼達和多巴哥英語是"en-TT"。例如,我們可以創(chuàng)建一個美國英語的CultureInfo對象并且基于這種文化將數(shù)字轉換成字符串。

intk?=12345;
CultureInfo?us?=newCultureInfo("en-US");
stringv?=k.ToString("c",?us);
Console.WriteLine(v);


輸出是:

$12,345.00


要注意到,我們使用了重載的ToString方法,它把第一個格式化字符串當成第一個參數(shù),將一個CultureInfo對象(執(zhí)行了IFormatProvider對象)作為第二個參數(shù)。這兒有第二個例子,對于丹麥人來說:

CultureInfo?dk?=newCultureInfo("da-DK");
stringw?=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實例必須要是可寫的,以便我們寫入自定義的格式并且存入屬性中

usingSystem.Globalization;

publicclassDatesApp
{
????publicstaticvoidMain(string[]?args)
????{
????????DateTime?dt?=DateTime.Now;
????????Console.WriteLine(dt);
????????Console.WriteLine("date?=?{0},?time?=?{1}\n",
????????????dt.Date,?dt.TimeOfDay);
????}
}


代碼會產生下面的輸出

23/06/200117:55:10
date?=23/06/200100:00:00,?time?=17:55:10.3839296


下表列出了標準的格式字符串以及相關的DateTimeFormatInfo屬性

D??
DMM/dd/yyyyShortDatePattern(短日期模式)
Ddddd,MMMM dd,yyyy???LongDatePattern(長日期模式)
Fdddd,MMMM dd,yyyy HH:mmFull date and time (long date and short time)(全日期和時間模式)
Fdddd,MMMM dd,yyyy HH:mm:ssFullDateTimePattern (long date and long time)(長日期和長時間)
GMM/dd/yyyy HH:mmGeneral (short date and short time)(通用模式,短日期和短時間)
GMM/dd/yyyy HH:mm:ssGeneral (short date and long time)(通用模式,短日期和長時間)
M,MMMMM dd?MonthDayPattern(月天模式)
r,Rddd,dd MMM yyyy,HH':'mm':'ss 'GMT'RFC1123Pattern (RFC1123模式)
Syyyy-MM-dd HH:mm:ss?SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地時間的可排序模式)
THH:mm?ShortTimePattern (短時間模式)
THH:mm:ssLongTimePattern(長時間模式)
Uyyyy-MM-dd HH:mm:ssUniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式)
Udddd,MMMM dd,yyyy,HH:mm:ssUniversalSortable-DateTimePattern(通用可排序模式)
y,YMMMM,yyyyYearMonthPattern(年月模式)


DateTimeFormatInfo.InvariantInfo屬性得到了默認的只讀的DateTimeFormatInfo實例,它與文化無關。你可以創(chuàng)建自定義的模式。要注意到的是InvariantInfo不一定和本地的格式一樣。Invariant等于美國格式。另外,如果你向DateTime.Format方法傳遞的第二個參數(shù)是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】:
?*1、本文為原創(chuàng)技術文章,首發(fā)博客園個人站點(http://flyingbread.cnblogs.com/),轉載和引用請注明作者及出處。
?*2、本文必須全文轉載和引用,任何組織和個人未授權不能修改任何內容,并且未授權不可用于商業(yè)。
?*3、本聲明為文章一部分,轉載和引用必須包括在原文中。
?******************************************************************************************/

總結

以上是生活随笔為你收集整理的【转】C#格式化字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。