格式输出(精选3篇)
格式输出 篇1
值(无论什么类型的值)的格式化输出对任何程序语言(或编程平台)而言都是非常重要的。早期的格式化输入/输出都是语言定义的一部分(如Fortran、Pascal等),功能有限又不灵活。C语言通过程序库(library)定义了scanf () /printf (输入/输出函数族,利用格式控制符(如d, f, u, x等等)为各种数据类型提供了多种格式化输入/输出手段,功能强大又相当灵活。
.NET Framework/C#(为行文方便,以下简称.NET)提供了一个可定制的、通用的格式化机制,将一个值格式化为适合显示的字符串。.NET借鉴了C语言的格式控制符的思想,在具备强大功能及相当的灵活性的同时,还提供了标准格式化的扩展机制,为值的格式化输出提供了功能完备的解决方案。
(1)标准格式化输出
.NET格式控制符的语法格式为:{index[, alignment][formatString]},有关格式控制符3部分的具体含义,请查阅MSDN,下面通过例子具体说明:
例1:.NET的标准格式化输出
.NET的标准格式化能够满足一般情况的输出需求,但也有很多情况,标准格式化不能满足要求。.NET提供了两种扩展标准格式化的手段,一是通过IFormattable接口允许类型作者定制自己的格式控制符;二是通过IFormatProvider和ICustomFormatter接口为类型的使用者提供扩展类型格式输出的手段。
(2)定制格式控制符
类型作者(class author)可以通过实现IFormattable接口为自己的类型提供定制的格式控制符。如有一个Customer类,要求联系电话根据情况或输出全部号码,或隐掉后4位号码。这时,可以设计特定的格式控制符:p表示输出全部号码,np表示隐掉后4位号码,实例代码如下:
例2:通过IFormattable接口实现定制格式控制符
类型作者利用IFormattable接口可以为自己的类型,如Customer类,定制各种输出形式。但现实世界是千变万化的,类型作者不可能穷尽一切可能,总有不能满足需求的时候,最好的办法是实现一种机制,让类型的使用者能够定义自己的格式化输出,这就是IFormatProvider和ICustomFormatter接口的功能。
(3)类型使用者定制格式化输出
decimal数据类型可以用来表示金额,有时候需要将金额以中文大写形式输出,decimal类型并没有这种格式化输出功能,这就需要自己进行扩展。
例3:用IFormatProvider和ICustomFormatter扩展已定义类型的格式化输出
(4)讨论
1).NET的格式控制符{index[, alignment][:formatString]}提供了标准化的格式输出手段,可以满足一般情况下的基本需求。而且NumberFormatInfo、DateTimeFormatInfo、CultureInfo类为一般数值及日期类型的格式化输出提供了灵活的控制手段。
2) IFormattable接口提供了第一级的扩展手段,类型作者可以利用该接口为自己的类型定制格式控制符。
3) IFormatProvider和ICustomFormatter提供了第二级的扩展手段,在类型不能满足使用者的特定需求时,类型的使用者可以利用这两个接口为该类型提供特定的格式化输出能力。
4) Bill Wagner的Effective C#第5条Always Provide ToString () 中的代码片段有两点问题:
(1) IFormattable.ToString (…) 中的代码片段
其中,用this.GetType () 作为GetFormat方法的参数是不对的,因为Customer没有实现ICustomFormatter接口(而且要求Customer实现ICustomFormatter接口也是不合理的),所以总是返回null,因为后文CustomFormatter类的GetFormat方法的判断语句:
if (formatType==typeof (ICustomFormatter) )
总是不成立!
IFormatProvider在这点上让人迷惑,GetFormat () 是获取定制格式化器,传送this.GetType () 作为参数显然是不对的,因为定制格式化器不是this对象所实现的功能,而是this对象的使用者(客户对象)所应实现的功能。如果将typeof (ICustomFormatter) 作为参数就没问题了,但从GetFormat () 方法的实现代码来看,似乎有点同义反复的味道。
从FormatProvider的字面上来看,formatProvider本身就应该“制造”一个定制格式化器出来,而不需要由调用者将定制格式化器作为参数传给GetFormat () ,然后再由GetFormat () 将其返回给调用者!即:
ICustomFormatter fmt=formatProvider.GetFormatter () ;
至于如何“制造”一个定制格式化器,则是该FormatProvider自己的事情,不然怎么能称为“Provider”呢?当然,你也可以在GetFormat () 中“武断”地不用管传送进来的是什么参数,总是“制造”一个定制格式化器返回给调用者。但这样做又与方法调用的约定不符合了。
(2) 定制格式化器的调用语句
Console.WriteLine (string.Format (new CustomFormatter () , "", c1) ) ;
其中,format参数为空字符串("")是不对的。虽然CustomFormatter的Format () 方法没有用到format,但在string.Format () 的参数中,format如果为null,则引发异常,如果为空字符串,则什么也不输出。这可以在StringBuilder.AppendFormat (IFormatProvider provider, string format, object[]args) 的实现代码中就可以看出来(string.Format最终归结为调用StringBuilder.AppendFormat),如果format为空字符串,则中途就返回了,根本没有调用Format () 。
(5) IFormatProvider接口为已定义类型和定制格式化器(实现ICustomFormatter接口的用户类型,用于扩展已定义类型的格式化输出)的中介,string.Format通过IFormatProvider获取定制格式化器(CustomFormatter),而对象的格式化由该定制格式化器来完成。用户不需要了解已定义类型的内部细节,只需要实现IFormatProvider和ICustomFormatter这两个接口,就可以定制已定义类型的格式化输出。非常灵活而优雅。
(6)软件(classes, components, frameworks等)的扩展性(extensibility)是框架设计者非常关注的问题,通过探讨了大量的实现机制,从Windows Hooks到类的继承,再到各种设计模式等。值的格式化输出非常重要,但其需求又千变万化(从各种文化,到各种格式,不一而足),所以实现一种扩展机制就更加重要且必要。.NET通过3个接口IFormattable、IFormatProvider、ICustomFormatter为各类开发人员(类型作者、类型使用者)提供了灵活而完备的扩展机制,很好地实现了“开放-闭合”原则,是实现软件扩展性足资参考的典范。
上文从标准格式化输出、定制格式控制符和类型使用者定制格式化输出三个方面介绍了.NET提供的格式化输出机制,最后简要地讨论了这种机制对实现一般意义上的软件扩展性的启迪与参考。
格式输出 篇2
DWG格式:
DWG格式是我们最常用的,只要用于图纸的保存、交流。很多人认为DWG格式是AUTOCAD的专属格式,其实不然。DWG格式是属于欧洲 OPEN组织所颁发的格式,只要是这个组织的核心会员之一就可以自由的使用这个格式。DWG格式使用非常广泛,所以大家都清楚,我就不用多说了。本文主要讲下PDF和JPG格式。
PDF格式:
除了DWG格式以外,用到最多的就是PDF格式了。在CAD使用中会碰到一些图纸不想让别人去修改、使用我们的图纸,这样的情况下给别人DWG 格式很明显就是不合适的,
那么在这种情况下我们就常常输出成PDF格式给客户。那怎么输出PDF格式呢?再传统的CAD中需要在绘图仪管理器中添加PDF 格式打印机,而在浩辰CAD就很简单了,只需要在打印界面中的选择PDF格式打印机就好了。
选择完成后,进行打印到文件,软件就会打印一张PDF格式的图纸到我们的电脑中了。除了这种方式以外还可以直接输出PDF格式的文件。具体操作如下:文件-----输出----选择PDF格式输出。
JPG格式:
格式输出 篇3
这篇文章主要介绍了python中日期和时间格式化输出的方法,实例总结了Python常见的日期与事件操作技巧,非常具有实用价值,需要的朋友可以参考下
本文实例总结了python中日期和时间格式化输出的方法,分享给大家供大家参考。具体分析如下:
python格式化日期时间的函数为datetime.datetime.strftime;由字符串转为日期型的函数为:datetime.datetime.strptime(),两个函数都涉及日期时间的格式化字符串,这里提供详细的代码详细演示了每一个参数的使用方法及范例。
下面是格式化日期和时间时可用的替换符号 %a 输出当前是星期几的英文简写
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%a‘)‘Sun‘
%A 输出完整的星期几名称英文
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%A‘)‘Sunday‘
%b 输出月份的英文简写
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%b‘)‘Sep‘
%B 输出月份的英文完整名称
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%B‘)‘September‘
%c 以本地时间显示日期和时间
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%c‘)‘09/15/13 21:43:29‘
%d 显示1-31之间的数,每月的第几天,也就是年月日中的日
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%d‘)‘15‘
%H 以24小时制显示小时,比如,02,14
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%H‘)‘21‘
%I 以12小时制的方式显示当前小时,例如当前jb51.net服务器的时间为晚上21点,使用%I显示09
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%I‘)‘09‘
%j 显示当前日期为一年中的第几天,如当前jb51.net服务器时间为9月15日,则显示为258,也就是一年中的第258天
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%j‘)‘258‘
%m 显示1-12之间的月份
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%m‘)‘09‘
%M 显示00-59之间的分钟数
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%M‘)‘43‘
%p 以 A.M./P.M.方式显示是上午还是下午
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%p‘)‘PM‘
%S 显示0-59之间的秒数
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%S‘)‘29‘
%U 显示一年中的第几周,星期天为一周的第一天,例如当前www.jb51.net服务器时间为209月15日,星期天,显示为第37周
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%U‘)‘37‘
%w 显示一周中的第几天,其中星期天为0,星期一为1,例如:jb51.net当前日期为年9月17日星期二,则显示结果为2
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%w‘)‘2‘
%W 显示一年中的第几周,和U%把不同的是星期一为一周的第一天,例如当前www.jb51.net服务器时间为2013年9月17日,星期二,显示为第37周,范围在0-51之间
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%W‘)‘37‘
%x 显示当地的日期,例如jb51.net本地时间为:北京时间2013年9月17日
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%x‘)‘09/17/13‘
%X 显示当地的时间,例如jb51.net本地时间为:北京时间2013年9月17日 07:55:04
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%X‘)‘07:55:04‘
%y 显示(00 - 99) 之间的年份,例如:jb51.net服务器时间为:2013年9月17日,则显示结果为13
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%y‘)‘13‘
%Y 显示完整年份,例如:jb51.net服务器时间为:2013年9月17日,则显示结果为2013
>>>import datetime>>>now=datetime.datetime.now()>>>now.strftime(‘%Y‘)‘2013‘
%z, %Z 输出时区,如果不能显示,则显示为空字符 %% 用于显示%符号
>>>now.strftime(‘%%‘)‘%‘
在举一个完整的例子:
显示当前日期时间:格式为:年-月-日 时:分:秒
>>>datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S‘);‘2013-09-17 08:06:17‘