Delphi format的用法
上一篇 / 下一篇 2008-05-05 23:59:52 / 个人分类:Delphi
一、Format函数的用法51Testing软件测试网fudwl@B3n?"q
Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:51Testing软件测试网~w3\ GToO-p,n2TVX
首先看它的声明:51Testing软件测试网 BE wJD8C#Ho
function Format(const Format: string; const Args: array of const): string; overload;51Testing软件测试网xT5DX{2S {
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,但并不多用,所以这里只对第一个介绍:51Testing软件测试网*B5m]RH |
#M(z9nX(XnV m#m0function Format(const Format: string; const Args: array of const): string; overload;
QT0E;W[B+H G0Format参数是一个格式字符串,用于格式化Args里面的值的。Args又是什么呢,它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。51Testing软件测试网A`2eQ)Oyj&[kIO T
如以下例子:51Testing软件测试网$d FM;_f8r
Format('my name is %6s',['wind']);51Testing软件测试网r mH"cX3tp-kA|
返回后就是51Testing软件测试网4p,a"u;_Biv:x7G8vT
my name is wind51Testing软件测试网5g7[0I |Y5\5Chq
!p0Xc0N ]BW`0现在来看Format参数的详细情况:
)I6T^Xn&Ww2i9W0Format里面可以写普通的字符串,比如'my name is' 但有些格式指令字符具有特殊意义,比如"%6s"51Testing软件测试网&i&|0KU zJ*w
[+@(I DA0格式指令具有以下的形式:
b3u0G\:M&R0"%" [index ":"] ["-"] [width] ["." prec] type
3VT5N0~M0它是以"%"开始,而以type结束,type表示一个具体的类型。中间是用来格式化type类型的指令字符,是可选的。51Testing软件测试网3@#ax-h%l!SJ
51Testing软件测试网 `0a1@ HA5d!uD*?
先来看看type,type可以是以下字符:
(mv:Jy[{Mdd2fU"g&]k0d 十制数,表示一个整型值51Testing软件测试网]2B6@ rE'{$G
u 和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时是一个2的32次方减去这个绝对值的数51Testing软件测试网0C}'DY)An!PH
如:Format('this is %u',[-2]);
|4AkU*[PoJ6c1`0 返回的是:this is 429496729451Testing软件测试网:\PI@5o_)hy%j.H
f 对应浮点数51Testing软件测试网s/JU(|@ Pj.F0x
e 科学表示法,对应整型数和浮点数,51Testing软件测试网;{K.Ii;sA$k q$G
比如Format('this is %e',[-2.22]);51Testing软件测试网QMP ~3h)G
返回的是:this is -2.22000000000000E+00051Testing软件测试网y7[P3q/rR~0cX
等一下再说明如果将数的精度缩小
r9K3irs;PE y0g 这个只能对应浮点型,且它会将值中多余的数去掉51Testing软件测试网r'q$Ew_2Q9[ Kr
比如Format('this is %g',[02.200]);
/k&llfdj!X/tL0 返回的是:this is 2.2
+IR VFN0n 只能对应浮点型,将值转化为号码的形式。看一个例子就明白了51Testing软件测试网5fab(}$Opq\$jzt
Format('this is %n',[4552.2176]);51Testing软件测试网;n \9X_.I Pt$_S
返回的是this is 4,552.2251Testing软件测试网6{.n Y#aa1C rD,IL
注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况51Testing软件测试网 q? kE Ol/H+X2^^
二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
Z c;XZk-eJw0m 钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
DT-jIdN-B0`&T0 另外它只对应于浮点值51Testing软件测试网:Z,x6{7@ n b n
Format('this is %m',[9552.21]);51Testing软件测试网+V|)}8p%\+~ U Y
返回:this is ¥9,552.2151Testing软件测试网 S)M%\A$U$D
p 对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示51Testing软件测试网(c&pz^ \)se
例如:
HAm6UuZ(Ym0 var X:integer;51Testing软件测试网8zQ$?^x*xC*r
p:^integer;51Testing软件测试网8v9au-z$o q:{4vM
begin
s0}|X`0Y3j0 X:=99;51Testing软件测试网-zvT&q6K"j5p`
p:=@X;
-Hv/vJ!N~^0 Edit1.Text:=Format('this is %p',[p]);
K}lBB'HG\#i4x0 end;
MN Nn^@}X0 Edit1的内容是:this is 0012F54851Testing软件测试网i9dS2vY([k.{
s 对应字符串类型,不用多说了吧
a bw ]8n0x 必须是一个整形值,以十六进制的形式返回51Testing软件测试网i'DW z)n;q)t2}
Edit1.Text:=Format('this is %X',[15]);51Testing软件测试网;w)c#f0Ea)jcDHV
返回是:this is F
ZL1rB2Q0n"K!_0
m(MgN/I M0类型讲述完毕,下面介绍格式化Type的指令:51Testing软件测试网 Y^K#E8Zj7R
[index ":"] 这个要怎么表达呢,看一个例子
z d$p/w!i0yO'BM0X0 Format('this is %d %d',[12,13]);
nm$Q"{ u3`0 其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候
(R?y(I\zkM0 是这样 this is 12 1351Testing软件测试网G/x]P&Y,Y^g!N@
Q-x,~mS9Qt0 而如果你这样定义:
2NX-[H&k:N"R0 Format('this is %1:d %0:d',[12,13]);51Testing软件测试网uJ(G_)}$i6\
那么返回的字符串就变成了51Testing软件测试网1n` x-Mn#zX
this is 13 1251Testing软件测试网q l4Ah` y
现在明白了吗,[index ":"] 中的index指示Args中参数显示的
cTnsTV?j[0 顺序
4`G%N2k{$G LM0
/i zsg"`-} C fs0 还有一种情况,如果这样Format('%d %d %d %0:d %d', [1, 2, 3, 4])
;h GB(LQ[0 将返回1 2 3 1 2。51Testing软件测试网rq| t!?%G uzF7p!_
如果你想返回的是1 2 3 1 4,必须这样定:
rTS-H]{'\J0 Format('%d %d %d %0:d %3:d', [1, 2, 3, 4])51Testing软件测试网X2Jd an Z+mk)_
但用的时候要注意,索引不能超出Args中的个数,不然会引起异常51Testing软件测试网9fV0iO.K$Q
如Format('this is %2:d %0:d',[12,13]);
.Z+u"ge5M5o pR `m(G0 由于Args中只有12 13 两个数,所以Index只能是0或1,这里为2就错了
EL3h%d:r N%D.]$Tl0[width] 指定将被格式化的值占的宽度,看一个例子就明白了
s|H)o&i2Zup%W0 Format('this is %4d',[12]);
PuqP$Ext3Vx0 输出是:this is 12
'A.a:_D,Rc0 这个是比较容易,不过如果Width的值小于参数的长度,则没有效果。51Testing软件测试网3kY(Id!n:He
如:Format('this is %1d',[12]);51Testing软件测试网K3cx|m{
输出是:this is 12
l-]^1k+d&Q r!u:|z0["-"] 这个指定参数向左齐,和[width]合在一起最可以看到效果:51Testing软件测试网kL/|&Wo%|H\
Format('this is %-4d,yes',[12]);51Testing软件测试网kG1ZSE4s@ ~(A?d
输出是:this is 12 ,yes
gF9d(kk%E0
9P2hH]K:pF0["." prec] 指定精度,对于浮点数效果最佳:51Testing软件测试网T,~)m vf,^Z
Format('this is %.2f',['1.1234]);51Testing软件测试网%?-M\ U@ D8ly?X9A
输出 this is 1.1251Testing软件测试网S0w#nl6j8NaPP
Format('this is %.7f',['1.1234]);51Testing软件测试网vN4k'zp)R-n8LqR
输了 this is 1.123400051Testing软件测试网s*R aR(g
rny2v'iq$y\0 而对于整型数,如果prec比如整型的位数小,则没有效果反之比整形值的位数大,则会在整型值的前面以0补之51Testing软件测试网N eb#@8\B6B
Format('this is %.7d',[1234]);
Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:51Testing软件测试网~w3\ GToO-p,n2TVX
首先看它的声明:51Testing软件测试网 BE wJD8C#Ho
function Format(const Format: string; const Args: array of const): string; overload;51Testing软件测试网xT5DX{2S {
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,但并不多用,所以这里只对第一个介绍:51Testing软件测试网*B5m]RH |
#M(z9nX(XnV m#m0function Format(const Format: string; const Args: array of const): string; overload;
QT0E;W[B+H G0Format参数是一个格式字符串,用于格式化Args里面的值的。Args又是什么呢,它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。51Testing软件测试网A`2eQ)Oyj&[kIO T
如以下例子:51Testing软件测试网$d FM;_f8r
Format('my name is %6s',['wind']);51Testing软件测试网r mH"cX3tp-kA|
返回后就是51Testing软件测试网4p,a"u;_Biv:x7G8vT
my name is wind51Testing软件测试网5g7[0I |Y5\5Chq
!p0Xc0N ]BW`0现在来看Format参数的详细情况:
)I6T^Xn&Ww2i9W0Format里面可以写普通的字符串,比如'my name is' 但有些格式指令字符具有特殊意义,比如"%6s"51Testing软件测试网&i&|0KU zJ*w
[+@(I DA0格式指令具有以下的形式:
b3u0G\:M&R0"%" [index ":"] ["-"] [width] ["." prec] type
3VT5N0~M0它是以"%"开始,而以type结束,type表示一个具体的类型。中间是用来格式化type类型的指令字符,是可选的。51Testing软件测试网3@#ax-h%l!SJ
51Testing软件测试网 `0a1@ HA5d!uD*?
先来看看type,type可以是以下字符:
(mv:Jy[{Mdd2fU"g&]k0d 十制数,表示一个整型值51Testing软件测试网]2B6@ rE'{$G
u 和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时是一个2的32次方减去这个绝对值的数51Testing软件测试网0C}'DY)An!PH
如:Format('this is %u',[-2]);
|4AkU*[PoJ6c1`0 返回的是:this is 429496729451Testing软件测试网:\PI@5o_)hy%j.H
f 对应浮点数51Testing软件测试网s/JU(|@ Pj.F0x
e 科学表示法,对应整型数和浮点数,51Testing软件测试网;{K.Ii;sA$k q$G
比如Format('this is %e',[-2.22]);51Testing软件测试网QMP ~3h)G
返回的是:this is -2.22000000000000E+00051Testing软件测试网y7[P3q/rR~0cX
等一下再说明如果将数的精度缩小
r9K3irs;PE y0g 这个只能对应浮点型,且它会将值中多余的数去掉51Testing软件测试网r'q$Ew_2Q9[ Kr
比如Format('this is %g',[02.200]);
/k&llfdj!X/tL0 返回的是:this is 2.2
+IR VFN0n 只能对应浮点型,将值转化为号码的形式。看一个例子就明白了51Testing软件测试网5fab(}$Opq\$jzt
Format('this is %n',[4552.2176]);51Testing软件测试网;n \9X_.I Pt$_S
返回的是this is 4,552.2251Testing软件测试网6{.n Y#aa1C rD,IL
注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况51Testing软件测试网 q? kE Ol/H+X2^^
二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
Z c;XZk-eJw0m 钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
DT-jIdN-B0`&T0 另外它只对应于浮点值51Testing软件测试网:Z,x6{7@ n b n
Format('this is %m',[9552.21]);51Testing软件测试网+V|)}8p%\+~ U Y
返回:this is ¥9,552.2151Testing软件测试网 S)M%\A$U$D
p 对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示51Testing软件测试网(c&pz^ \)se
例如:
HAm6UuZ(Ym0 var X:integer;51Testing软件测试网8zQ$?^x*xC*r
p:^integer;51Testing软件测试网8v9au-z$o q:{4vM
begin
s0}|X`0Y3j0 X:=99;51Testing软件测试网-zvT&q6K"j5p`
p:=@X;
-Hv/vJ!N~^0 Edit1.Text:=Format('this is %p',[p]);
K}lBB'HG\#i4x0 end;
MN Nn^@}X0 Edit1的内容是:this is 0012F54851Testing软件测试网i9dS2vY([k.{
s 对应字符串类型,不用多说了吧
a bw ]8n0x 必须是一个整形值,以十六进制的形式返回51Testing软件测试网i'DW z)n;q)t2}
Edit1.Text:=Format('this is %X',[15]);51Testing软件测试网;w)c#f0Ea)jcDHV
返回是:this is F
ZL1rB2Q0n"K!_0
m(MgN/I M0类型讲述完毕,下面介绍格式化Type的指令:51Testing软件测试网 Y^K#E8Zj7R
[index ":"] 这个要怎么表达呢,看一个例子
z d$p/w!i0yO'BM0X0 Format('this is %d %d',[12,13]);
nm$Q"{ u3`0 其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候
(R?y(I\zkM0 是这样 this is 12 1351Testing软件测试网G/x]P&Y,Y^g!N@
Q-x,~mS9Qt0 而如果你这样定义:
2NX-[H&k:N"R0 Format('this is %1:d %0:d',[12,13]);51Testing软件测试网uJ(G_)}$i6\
那么返回的字符串就变成了51Testing软件测试网1n` x-Mn#zX
this is 13 1251Testing软件测试网q l4Ah` y
现在明白了吗,[index ":"] 中的index指示Args中参数显示的
cTnsTV?j[0 顺序
4`G%N2k{$G LM0
/i zsg"`-} C fs0 还有一种情况,如果这样Format('%d %d %d %0:d %d', [1, 2, 3, 4])
;h GB(LQ[0 将返回1 2 3 1 2。51Testing软件测试网rq| t!?%G uzF7p!_
如果你想返回的是1 2 3 1 4,必须这样定:
rTS-H]{'\J0 Format('%d %d %d %0:d %3:d', [1, 2, 3, 4])51Testing软件测试网X2Jd an Z+mk)_
但用的时候要注意,索引不能超出Args中的个数,不然会引起异常51Testing软件测试网9fV0iO.K$Q
如Format('this is %2:d %0:d',[12,13]);
.Z+u"ge5M5o pR `m(G0 由于Args中只有12 13 两个数,所以Index只能是0或1,这里为2就错了
EL3h%d:r N%D.]$Tl0[width] 指定将被格式化的值占的宽度,看一个例子就明白了
s|H)o&i2Zup%W0 Format('this is %4d',[12]);
PuqP$Ext3Vx0 输出是:this is 12
'A.a:_D,Rc0 这个是比较容易,不过如果Width的值小于参数的长度,则没有效果。51Testing软件测试网3kY(Id!n:He
如:Format('this is %1d',[12]);51Testing软件测试网K3cx|m{
输出是:this is 12
l-]^1k+d&Q r!u:|z0["-"] 这个指定参数向左齐,和[width]合在一起最可以看到效果:51Testing软件测试网kL/|&Wo%|H\
Format('this is %-4d,yes',[12]);51Testing软件测试网kG1ZSE4s@ ~(A?d
输出是:this is 12 ,yes
gF9d(kk%E0
9P2hH]K:pF0["." prec] 指定精度,对于浮点数效果最佳:51Testing软件测试网T,~)m vf,^Z
Format('this is %.2f',['1.1234]);51Testing软件测试网%?-M\ U@ D8ly?X9A
输出 this is 1.1251Testing软件测试网S0w#nl6j8NaPP
Format('this is %.7f',['1.1234]);51Testing软件测试网vN4k'zp)R-n8LqR
输了 this is 1.123400051Testing软件测试网s*R aR(g
rny2v'iq$y\0 而对于整型数,如果prec比如整型的位数小,则没有效果反之比整形值的位数大,则会在整型值的前面以0补之51Testing软件测试网N eb#@8\B6B
Format('this is %.7d',[1234]);