针对“现成”的问题再说几句:
有人觉得,VFP中关于DateTime数据类型的DTOC()或DTOS()函数很好用了,现成的,要把日期{^2011.09.12}转换为字符型"2011-09-12",先DTOC()成"2011.09.12",再用CHRTRAN()把句号.换成减号-,两条语句很高效了。事实真是这样吗?
其实,熟悉CHRTRAN()查找-替换算法的人,都知道要在字符串"2011.09.12"中找到"."的位置,是从头开始逐个字符比较,如果它是".",就删掉(此时要移动后面一串字符),然后再把替换的字符"-"插入原先"."的位置(又把后面的一串字符移动一次),这个搬动字符的过程是不可免的,因为CHRTRAN()函数设计的时候,并不是要等长替换,即一个字符"."换一个字符"-",而是可以一个字符"."换一串字符如"$$$"(或者多换少)等等,所以它无法事先知道该保留多少空隙不移,则只能密合了之后再分开,以保证不会出错。这是一个复杂的动作,何况现在所需要的不是只做一次替换就完了,而是要不断地找,直到再没有"."符号为止。
再看VFP的DateTime数据类型实际格式,它其实是C中的结构struct,与操作系统的内部格式相同,即类似如下的结构:
struct DateTime
{
int Year;
int Month;
int Day;
int Week;
int Hour;
int Minute;
int Second;
};
这样的数据结构,才能很方便地计算日期,比如Excel中那个计算日期差的函数,就是用这样的数据计算的,所以能够很方便地得到年差、月差、日差之类的结果(很简单,用年减之后乘12就有月差了,再加一下就成,没有复杂的运算)。所以,VFP中的YEAR()函数其实非常简单,就是把上面结构中的Year值提取出来而已。而恐怕很多人不知道的地方,是VFP的数值存储形式,其实全部是字符型(即使是双精度浮点数也是如此,即DateTime也是一串数字型字符而已,本来就是DTOS()那样的"20110912"格式,DTOC()反而复杂了),因此,YEAR()的操作,完全是不费吹灰之力,连数据类型转换都不用(所谓数据类型转换,其实是语言表面上的东西,让程序员写程序时逻辑清晰的,事实上VFP没做那种动作)。明白这个原理,也就知道VFP那一大堆SET DATE TO格式指令没有任何神秘之处。
也就是说,我们要达到目的,用STR(YEAR(d),4)+"-"+PADL(MONTH(d),2,'0')+"-"+PADL(DAY(d),2,'0')其实是最高效的,因为就是若干字符串相加而已,没有搜索、没有替换、没有挪移、没有……这个就是DTOC()函数的内部行为。
现成,优越得到哪去!不要以为走过头了再返回来修修补补,表面代码少了,就事实上也高效。微软指南:优秀的程序员应该反复提醒自己,“少的源代码未必产生高效的机器码!”
[
本帖最后由 TonyDeng 于 2011-9-12 13:19 编辑 ]