C#字符串格式化说明_第1页
C#字符串格式化说明_第2页
C#字符串格式化说明_第3页
C#字符串格式化说明_第4页
C#字符串格式化说明_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#字符串格式化说明(String.Format  1 前言   如果你熟悉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

2、 = String.Format( "item 0 sells at 1:C", x, y Console.WriteLine(h;在我的机器上,可以得到下面的输出:item 16 sells at ¥3.57也许你的机器上的输出和这个不太一样。这是正常的,本文稍后就会解释这个问题。   在我们日常使用中,更多的是使用Console.WriteLine方法来输出一个字符串。其实String.Format和

3、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 

4、= 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

5、60;8Hello 123 45.67 True Q 4 5 6 7 82 字符串格式String.Format和WriteLine都遵守同样的格式化规则。格式化的格式如下:" N , M : formatString ", arg1, . argN,在这个格式中:1) N是从0开始的整数,表示要格式化的参数的个数2) M是一个可选的整数,表示格式化后的参数所占的宽度,如果M是负数,那么格式化后的值就是左对齐的,如果M是正数,那么格式化后的值是右对齐的3) formatString是另

6、外一个可选的参数,表示格式代码argN表示要格式化的表达式,和N是对应的。如果argN是空值,那么就用一个空字符串来代替。如果没有formatString,那么就用参数N对应的ToString方法来格式化。下面的语句会产生同样的输出:public class TestConsoleApp    public static void Main(string args           &

7、#160;Console.WriteLine(123;        Console.WriteLine("0", 123;        Console.WriteLine("0:D3", 123;    输出是:123123123也可以通过String.Format得到同样的输出。string s = s

8、tring.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进制。就像下面这样

9、:Console.WriteLine("0,5 1,5", 123, 456;      / 右对齐Console.WriteLine("0,-5 1,-5", 123, 456;    / 左对齐输出是123   456123   456也可以合并这些表达式,先放一个逗号,再放一个冒号。就像这样:Console.Wr

10、iteLine("0,-10:D6 1,-10:D6", 123, 456;输出是:000123     000456我们可以用这种格式化特性来对齐我们的输出。Console.WriteLine("n0,-101,-3", "Name","Salary"Console.WriteLine("-"Console.WriteLine("0,-101,6", "Bill&q

11、uot;, 123456;Console.WriteLine("0,-101,6", "Polly", 7890;输出是:Name      Salary-Bill      123456Polly       78903 格式化标识符标准的数学格式字符串用于返回通常使用的字符串。它们通常象X0这样的格式。X是格式化标识符,0是精度标识符

12、。格式标识符号共有9种,它们代表了大多数常用的数字格式。就像下表所示:字母 含义C或cCurrency 货币格式D或dDecimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了)E或eExponent 指数格式F或fFixed point 固定精度格式G或gGeneral 常用格式N或n用逗号分割千位的数字,比如1234将会被变成1,234P或pPercentage 百分符号格式R或rRound-trip  圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字X或xHex 16进制格式如果我们使用下面的表达方式,让我们看看会发

13、生什么public class FormatSpecApp    public static void Main(string args            int i = 123456;        Console.WriteLine("0:C"

14、;, i; / ¥123,456.00        Console.WriteLine("0:D", i; / 123456        Console.WriteLine("0:E", i; / 1.234560E+005       

15、; Console.WriteLine("0:F", i; / 123456.00        Console.WriteLine("0:G", i; / 123456        Console.WriteLine("0:N", i; / 123,456.00 &

16、#160;      Console.WriteLine("0:P", i; / 12,345,600.00 %        Console.WriteLine("0:X", i; / 1E240    精度控制标识控制了有效数字的个数或者十进制数小数的位数。Console.WriteLine("

17、0:C5", i; / ¥123,456.00Console.WriteLine("0:D5", i; / 123456Console.WriteLine("0:E5", i; / 1.23456E+005Console.WriteLine("0:F5", i; / 123456.00000Console.WriteLine("0:G5", i; / 1.2

18、3456E5Console.WriteLine("0:N5", i; / 123,456.00000Console.WriteLine("0:P5", i; / 12,345,600.00000 %Console.WriteLine("0:X5", i; / 1E240R(圆整)格式仅仅对浮点数有效。这个值首先会用通用格式来格式化。对于双精度数有15位精度,对于单精度数有7位精度。如果这个值可以被正确地解析回原始的数字,就会用通用格式符

19、来格式化。如果不能解析回去的话,那么就会用17位精度来格式化双精度数,用9位精度来格式化单精度数。尽管我们可以在圆整标识符后面添加有效数字的位数,但是它会被忽略掉。double d = 1.2345678901234567890;Console.WriteLine("Floating-Point:t0:F16", d;  / 1.2345678901234600Console.WriteLine("Roundtrip:t0:R16", d;   

20、    / 1.2345678901234567如果标准格式化标识符还不能满足你。你可以使用图形化格式字符串来创建定制的字符串输出。图形化格式化使用占位符来表示最小位数,最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示 符号名称含义00占位符用0填充不足的位数#数字占位符用#代替实际的位数.十进制小数点,千位分隔符用逗号进行千位分割,比如把1000分割成1,000%百分符号显示一个百分标识E+0E-0e+0e-0指数符号用指数符号格式化输出专一字符用于传统格式的格式化序列,比如"n"(新行)

21、9;ABC'"ABC"常量字符串 显示单引号或者双引号里面的字符串;区域分隔符 如果数字会被格式化成整数,负数,或者0,用;来进行分隔,.缩放符号数字除以1000看下面的例子:            double i = 123456.42;            Console.

22、WriteLine(;            Console.WriteLine("0:000000.00", i; /123456.42            Console.WriteLine("0:00.00000000e+0", i; /12.34564200e+4

23、60;           Console.WriteLine("0:0,.", i;          /123            Console.WriteLine("0:#0.000", i;

24、0;            / 123456.420            Console.WriteLine("0:#0.000;(#0.000", i;        / 123456.420   

25、;         Console.WriteLine("0:#0.000;(#0.000; ", i;  / 123456.420            Console.WriteLine("0:#%", i;     / 12345642%

26、60;           i = -123456.42;            Console.WriteLine(;            Console.WriteLine("0:000000.00",&

27、#160;i; /-123456.42            Console.WriteLine("0:00.00000000e+0", i; /-12.34564200e+4            Console.WriteLine("0:0,.", i;  

28、;        /-123            Console.WriteLine("0:#0.000", i;             / -123456.420     &

29、#160;      Console.WriteLine("0:#0.000;(#0.000", i;        / (123456.420            Console.WriteLine("0:#0;(#0; ", i;  / (12

30、3456            Console.WriteLine("0:#%", i;             / -12345642%            i = 

31、0;            Console.WriteLine(;            Console.WriteLine("0:0,.", i;          /0     

32、;       Console.WriteLine("0:#0", i;             / 0            Console.WriteLine("0:#0;(#0", i; 

33、60;      / 0            Console.WriteLine("0:#0;(#0; ", i;  /              Console.WriteLine("0:#%", i;&#

34、160;            / %4 数字字符串的解析所有的基础类型都有ToString方法,它是从object类型中继承过来的。所有的数值类型都有Parse方法,它用字符串为参数,并且返回相等的数值。比如public class NumParsingApp    public static void Main(string args  

35、60;         int i = int.Parse("12345"        Console.WriteLine("i = 0", i;        int j = Int32.Parse("12

36、345"        Console.WriteLine("j = 0", j;        double d = Double.Parse("1.2345E+6"        Console.WriteLine("d =&

37、#160;0:F", d;        string s = i.ToString(;        Console.WriteLine("s = 0", s;    输出如下i = 12345j = 12345d = 1234500.0

38、0s = 12345在缺省状况下,某些非数字字符是可以存在的。比如开头和结尾的空白。逗号和小数点,加号和减号,因此,下面的Parse语句是一样的string t = "  -1,234,567.890  "/double g = double.Parse(t;        / 和下面的代码干同样的事情double g = double.

39、Parse(t,     NumberStyles.AllowLeadingSign |     NumberStyles.AllowDecimalPoint |    NumberStyles.AllowThousands |    NumberStyles.AllowLeadingWhite |     NumberStyl

40、es.AllowTrailingWhite;Console.WriteLine("g = 0:F", g;输出都是这样g = -1234567.89注意到,如果你要使用NumberStyles,就要添加对System.Globalization的引用,然后就可以使用不同 NumberStyles的组合或者其中的任意一种。如果你想兼容货币符号,就需要使用重载的Parse方法,它们采用了 NumberFormatInfo对象作为一个参数,然后你可以设置NumberFormatInfo的CurrencySymbol属性来调用 Pa

41、rse方法,比如:string u = "¥  -1,234,567.890  "NumberFormatInfo ni = new NumberFormatInfo(;ni.CurrencySymbol = "¥"double h = Double.Parse(u, NumberStyles.Any, ni;Console.WriteLine("h =&#

42、160;0:F", h;上面的代码有如下输出h = -1234567.89除了NumberFormatInfo,还可以使用CultureInfo类。CultureInfo代表了某种特定的文化,包括文化的名字,书写的方式,日历的格式。对于某种特定文化的操作是非常普遍的情况,比如格式化日期和排序。文化的命名方式遵从RFC1766标准,使用<语言代码 2>-<国家/地区码2>的方式,其中的<语言代码2>是两个小写的字母,它们来自ISO639-1;<国家/地区码2>是两个大写字母,它们来自ISO3166。比如,美国

43、英语是“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;输出是:$

44、12,345.00要注意到,我们使用了重载的ToString方法,它把第一个格式化字符串当成第一个参数,将一个CultureInfo对象(执行了IFormatProvider对象)作为第二个参数。这儿有第二个例子,对于丹麦人来说:CultureInfo dk = new CultureInfo("da-DK"string w = k.ToString("c", dk;Console.WriteLine(w;输出是:kr 12.345,005 字符串和日期using&

45、#160;System.Globalization;public class DatesApp    public static void Main(string args            DateTime dt = DateTime.Now;        Co

46、nsole.WriteLine(dt;        Console.WriteLine("date = 0, time = 1n",            dt.Date, dt.TimeOfDay;    代码会产生下面的输出23/06/2001 17:55:10d

47、ate = 23/06/2001 00:00:00, time = 17:55:10.3839296下表列出了标准的格式字符串以及相关的DateTimeFormatInfo属性DDMM/dd/yyyyShortDatePattern(短日期模式)Ddddd,MMMM dd,yyyy   LongDatePattern(长日期模式)Fdddd,MMMM dd,yyyy HH:mmFull date and time (long date and short time(全日期和时间模式)Fdddd,MMMM

48、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'R

49、FC1123Pattern (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(通用可排序模式)U

50、dddd,MMMM dd,yyyy,HH:mm:ssUniversalSortable-DateTimePattern(通用可排序模式)y,YMMMM,yyyyYearMonthPattern(年月模式)DateTimeFormatInfo.InvariantInfo属性得到了默认的只读的DateTimeFormatInfo实例,它与文化无关。你可以创建自定义的模式。要注意到的是InvariantInfo不一定和本地的格式一样。Invariant等于美国格式。另外,如果你向 DateTime.Format方法传递的第二个参数是null,DateTimeFormatInfo将会是默认的Curre

51、ntInfo。比如Console.WriteLine(dt.ToString("d", dtfi;Console.WriteLine(dt.ToString("d", null;Console.WriteLine(;输出是06/23/200123/06/2001对比选择InvariantInfo和CurrentInfo的。DateTimeFormatInfo dtfi;Console.Write("Invariant or Current Info?: "if (Console.Read( = 'I'    dtfi = DateTimeFormatInfo.InvariantInfo;else    dtfi = DateTimeFormatInfo.CurrentInfo;DateTimeFormatInfo dtfi = DateTimeFormatInfo.InvariantIn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论