




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用C#格式化字符串如果你熟悉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(item0sellsat1:C,x,y);Console.WriteLine(h);在我的机器上,可以得到下面的输出: item16sellsat¥3.57也许你的机器上的输出和这个不太一样。这是正常的,本文稍后就会解释这个问题。 在我们日常使用中,更多的是使用Console.WriteLine方法来输出一个字符串。其实String.Format和Console.WriteLine有很多共同点。两个方法都有很多重载的格式并且采用无固定参数的对象数组作为最后一个参数。下面的两个语句会产生同样的输出。 Console.WriteLine(Hello012345678,123,45.67,true,Q,4,5,6,7,8);stringu=String.Format(Hello012345678,123,45.67,true,Q,4,5,6,7,8);Console.WriteLine(u);输出如下: Hello12345.67TrueQ45678Hello12345.67TrueQ45678 2 字符串格式 String.Format和WriteLine都遵守同样的格式化规则。格式化的格式如下: N , M : formatString , arg1, . argN,在这个格式中: 1) N是从0开始的整数,表示要格式化的参数的个数 2) M是一个可选的整数,表示格式化后的参数所占的宽度,如果M是负数,那么格式化后的值就是左对齐的,如果M是正数,那么格式化后的值是右对齐的 3) formatString是另外一个可选的参数,表示格式代码 argN表示要格式化的表达式,和N是对应的。 如果argN是空值,那么就用一个空字符串来代替。如果没有formatString,那么就用参数N对应的ToString方法来格式化。下面的语句会产生同样的输出: publicclassTestConsoleApppublicstaticvoidMain(stringargs)Console.WriteLine(123);Console.WriteLine(0,123);Console.WriteLine(0:D3,123);输出是: 123123 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)决定了如何格式化数据,比如用货币符号,科学计数法或者16进制。就像下面这样: Console.WriteLine(0,51,5,123,456);/右对齐Console.WriteLine(0,-51,-5,123,456);/左对齐输出是 123456123456 也可以合并这些表达式,先放一个逗号,再放一个冒号。就像这样: Console.WriteLine(0,-10:D61,-10:D6,123,456);输出是: 000123000456我们可以用这种格式化特性来对齐我们的输出。 Console.WriteLine(n0,-101,-3,Name,Salary);Console.WriteLine(-);Console.WriteLine(0,-101,6,Bill,123456);Console.WriteLine(0,-101,6,Polly,7890);输出是: NameSalary- Bill123456 Polly7890 3 格式化标识符 标准的数学格式字符串用于返回通常使用的字符串。它们通常象X0这样的格式。X是格式化标识符,0是精度标识符。格式标识符号共有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进制格式如果我们使用下面的表达方式,让我们看看会发生什么 publicclassFormatSpecApppublicstaticvoidMain(stringargs)inti=123456;Console.WriteLine(0:C,i);/¥123,456.00Console.WriteLine(0:D,i);/123456Console.WriteLine(0:E,i);/1.234560E+005Console.WriteLine(0:F,i);/123456.00Console.WriteLine(0:G,i);/123456Console.WriteLine(0:N,i);/123,456.00Console.WriteLine(0:P,i);/12,345,600.00%Console.WriteLine(0:X,i);/1E240精度控制标识控制了有效数字的个数或者十进制数小数的位数。 Console.WriteLine(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.23456E5Console.WriteLine(0:N5,i);/123,456.00000Console.WriteLine(0:P5,i);/12,345,600.00000%Console.WriteLine(0:X5,i);/1E240R(圆整)格式仅仅对浮点数有效。这个值首先会用通用格式来格式化。对于双精度数有15位精度,对于单精度数有7位精度。如果这个值可以被正确地解析回原始的数字,就会用通用格式符来格式化。如果不能解析回去的话,那么就会用17位精度来格式化双精度数,用9位精度来格式化单精度数。尽管我们可以在圆整标识符后面添加有效数字的位数,但是它会被忽略掉。 doubled=1.2345678901234567890;Console.WriteLine(Floating-Point:t0:F16,d);/1.2345678901234600Console.WriteLine(Roundtrip:t0:R16,d);/1.2345678901234567如果标准格式化标识符还不能满足你。你可以使用图形化格式字符串来创建定制的字符串输出。图形化格式化使用占位符来表示最小位数, 最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示 符号名称含义00占位符用0填充不足的位数#数字占位符用#代替实际的位数.十进制小数点,千位分隔符用逗号进行千位分割,比如把1000分割成1,000%百分符号显示一个百分标识E+0 E-0 e+0 e-0指数符号用指数符号格式化输出专一字符用于传统格式的格式化序列,比如n(新行)ABC ABC常量字符串显示单引号或者双引号里面的字符串;区域分隔符如果数字会被格式化成整数,负数,或者0,用;来进行分隔,.缩放符号数字除以1000看下面的例子: doublei=123456.42;Console.WriteLine();Console.WriteLine(0:000000.00,i);/123456.42Console.WriteLine(0:00.00000000e+0,i);/12.34564200e+4Console.WriteLine(0:0,.,i);/123Console.WriteLine(0:#0.000,i);/123456.420Console.WriteLine(0:#0.000;(#0.000),i);/123456.420Console.WriteLine(0:#0.000;(#0.000);,i);/123456.420Console.WriteLine(0:#%,i);/12345642%i=-123456.42;Console.WriteLine();Console.WriteLine(0:000000.00,i);/-123456.42Console.WriteLine(0:00.00000000e+0,i);/-12.34564200e+4Console.WriteLine(0:0,.,i);/-123Console.WriteLine(0:#0.000,i);/-123456.420Console.WriteLine(0:#0.000;(#0.000),i);/(123456.420)Console.WriteLine(0:#0;(#0);,i);/(123456)Console.WriteLine(0:#%,i);/-12345642%i=0;Console.WriteLine();Console.WriteLine(0:0,.,i);/0Console.WriteLine(0:#0,i);/0Console.WriteLine(0:#0;(#0),i);/0Console.WriteLine(0:#0;(#0);,i);/Console.WriteLine(0:#%,i);/%4 数字字符串的解析 所有的基础类型都有ToString方法,它是从object类型中继承过来的。所有的数值类型都有Parse方法,它用字符串为参数,并且返回相等的数值。比如 publicclassNumParsingApppublicstaticvoidMain(stringargs)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=12345j=12345d=1234500.00s=12345在缺省状况下,某些非数字字符是可以存在的。比如开头和结尾的空白。逗号和小数点,加号和减号,因此,下面的Parse语句是一样的 stringt=-1,234,567.890;/doubleg=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对象作为一个参数,然后你可以设置NumberFormatInfo的CurrencySymbol属性来调用Parse方法,比如: stringu=¥-1,234,567.890;NumberFormatInfoni=newNumberFormatInfo();ni.CurrencySymbol=¥;doubleh=Double.Parse(u,NumberStyles.Any,ni);Console.WriteLine(h=0:F,h);上面的代码有如下输出 h=-1234567.89除了NumberFormatInfo,还可以使用CultureInfo类。CultureInfo代表了某种特定的文化,包括文化的名字,书写的方式,日历的格式。对于某种特定文化的操作是非常普遍的情况,比如格式化日期和排序。文化的命名方式遵从RFC1766标准,使用-的方式,其中的是两个小写的字母,它们来自ISO639-1;是两个大写字母,它们来自ISO3166。比如,美国英语是“en-US。英国英语是en-GB。特立尼达和多巴哥英语是en-TT。例如,我们可以创建一个美国英语的CultureInfo对象并且基于这种文化将数字转换成字符串。 intk=12345;CultureInfous=newCultureInfo(en-US);stringv=k.ToString(c,us);Console.WriteLine(v);输出是: $12,345.00要注意到,我们使用了重载的ToString方法,它把第一个格式化字符串当成第一个参数,将一个CultureInfo对象(执行了IFormatProvider对象)作为第二个参数。这儿有第二个例子,对于丹麦人来说: CultureInfodk=newCultureInfo(da-DK);stringw=k.ToString(c,dk);Console.WriteLine(w);输出是: kr12.345,005 字符串和日期 一个日期对象有个叫Ticks的属性。它存储了自从公元1年的1月1号上午12点开始的,以100纳秒为间隔的时间。比如,Ticks值等于31241376000000000L表示公元100年,星期五,1月1号,上午12点这一时间。Ticks总是以100纳秒为间隔递增。 DateTime的值以存储在DateTimeFormatInfo实例里面的标准或者自定义的方式来表示。为了修改一个日期显示的方式,DateTimeFormatInfo实例必须要是可写的,以便我们写入自定义的格式并且存入属性中 usingSystem.Globalization;publicclassDatesApppublicstaticvoidMain(stringargs)DateTimedt=DateTime.Now;Console.WriteLine(dt);Console.WriteLine(date=0,time=1n,dt.Date,dt.TimeOfDay);代码会产生下面的输出 23/06/200117:55:10date=23/06/200100:00:00,time=17:55:10.3839296 下表列出了标准的格式字符串以及相关的DateTimeFormatInfo属性 DDMM/dd/yyyyShortDatePattern(短日期模式)Ddddd,MMMM dd,yyyyLongDatePattern(长日期模式)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 ddMonthDayPattern(月天模式)r,Rddd,dd MMM yyyy,HH:mm:ss GMTRFC1123Pattern (RFC1123模式)Syyyy-MM-dd HH:mm:ssSortableDateTimePattern (conforms to ISO 8601) using local time(使用本地时间的可排序模式)THH:mmShortTimePattern (短时间模式)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实例,它与文化无关。你可以创建自定义的模式。要注意到的是InvariantInfo不一定和本地的格式一样。Invariant等于美国格式。另外,如果你向DateTime.Format方法传递的第二个参数是null,DateTimeFormatInfo将会是默认的CurrentInfo。比如 Console.WriteLine(dt.ToString(d,dtfi);Console.WriteLine(dt.ToString(d,null);Console.WriteLine();输出是 06/23/200123/06/2001 对比选择InvariantInfo和CurrentInfo的。 DateTimeFormatInfodtfi;Console.Write(InvariantorCurrentInfo?:);if(Console.Read()=I)dtfi=DateTimeFormatInfo.InvariantInfo;elsedtfi=DateTimeFormatInfo.CurrentInfo;DateTimeFormatInfodtfi=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.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师资格证考试(中学综合实践活动)教育知识与能力冲刺押题卷
- 2025年公务员考试行测言语理解专项试卷:逻辑判断与推理高效备考
- 2025年高考生物实验操作专项训练试题解析
- 现代信号处理课件张贤达pdf
- 2026届上海市比乐中学化学高三第一学期期中统考试题含解析
- 2026届湖南长沙县三中高一化学第一学期期中考试模拟试题含解析
- 旅游行业定制旅行项目计划
- 2026届贵州省湄潭县湄江中学化学高三上期末考试试题含解析
- 玉米打药知识培训课件
- 2025年度智能家居系统集成自然人房屋买卖与装修合同
- 人事经理工作汇报
- 项目实施进程汇报
- 2025学宪法讲宪法知识竞赛题库及答案(小学组)
- 中小企业网络安全解决方案概述
- 官方兽医考试题及完整答案详解(名校卷)
- 医学检验质量安全管理培训
- 2025年小学英语教师业务理论考试试题及答案
- 2025至2030中国基因分析服务行业项目调研及市场前景预测评估报告
- 公安行政案件办理务实课件
- 房地产样板间装饰工程重点难点及措施
- 康复科护理金点子
评论
0/150
提交评论