参考来源: MFC中CString.Format的详细用法
来源作者: yumodev
来源地址: https://blog.csdn.net/wangkaishou/article/details/5846152
Format简介
首先看它的声明:
function Format(const Format: string; const Args: array of const): string; overload;
(事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,但并不多用,所以这里只对第一个介绍 )
Format 参数是一个格式字符串 string,用于格式化Args里面的值的。
Args是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如例子: str.Format(_T(“Hello %6s”), _T(“World”)); 返回后就是 Hello World
Format参数的详细情况:
Format里面可以写普通的字符串,比如 "Hello "
但有些格式指令字符具有特殊意义,比如 “%6s”
1、Format格式指令具的形式
"%" [index ":"] ["-"] [width] ["." prec] type
它是以"%"开始,而以type结束,type表示一个具体的类型。中间是用来格式化type类型的指令字符,是可选的。
1.1、Format常用type字符:
type | 描述 |
---|---|
c | 单个字符 |
d | 十进制整数(int) |
ld | 十进制整数(long) |
f | 十进制浮点数(float) 6位小数 |
lf | 十进制浮点数(double) 6位小数 |
e | 以指数形式输出实数 |
E | 以指数形式输出实数 e符号大写E表示 |
g | 选用f与e格式中输出宽度较小的格式,6位有效数字,会将多余的0删除 |
G | 选用f与e格式中输出宽度较小的格式,6位有效数字,会将多余的0删除 使用指数表示时 e符号大写E表示 |
n | 只能对应浮点型,将值转化为号码的形式, |
X | 无符号十六进制数 用大写字母A,B,C,D,E,F来表示10到15之间的数 |
s | 字符串 |
u | 无符号十进制数 |
o | 无符号八进制数 |
x | 无符号十六进制数 用小写字母a,b,c,d,e,f来表示10到15之间的数 |
X | 无符号十六进制数 用大写字母A,B,C,D,E,F来表示10到15之间的数 |
1.2、[index “:”]
[index “:”] 中的index指示Args中参数显示的顺序
str.Format(_T("this is %d %d"),12,13);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候是: this is 12 13
str.Format(_T("this is %1:d %0:d"),12,13);
那么返回的字符串就变成了: this is 13 12
1.3、[width]
[width] 指定将被格式化的值占的宽度
str.Format(_T("this is %4d"),12); //str="this is 12"
如果Width的值小于参数的长度,则没有效果。
str.Format(_T("this is %1d"),12); //str="this is 12"
1.4、["-"]
["-"] 这个指定参数向左齐,在右侧补空格,和[width]合在一起最可以看到效果:
str.Format(_T("this is %-4d,yes"),12); //str="this is 12 ,yes"
1.5、["." prec]
["." prec] 指定精度,对于浮点数效果最佳
str.Format(_T("this is %.2f"), 1.1234); //str="this is 1.12"
str.Format(_T("this is %.7f"), 1.1234); //str="this is 1.1234000"
对于整型数,如果prec比如整型的位数小,则没有效果 反之比整形值的位数大,则会在整型值的前面以0补之
str.Format(_T("this is %.7d"), 1234); //str="this is 0001234"
结果与如下利用[width] 进行控制相同,这里%07中,写成%7则会在左侧补空格,%07则在左侧补0
str.Format(_T("this is %07d"), 1234); //str="this is 0001234"
对于字符型,刚好和整型值相反,如果prec比字符串型的长度大 则没有效果,反之比字符串型的长度小,则会截断尾部的字符
str.Format(_T("this is %.2s"), _T("1234")); //str="this is 12"
2、int、long 转 CString:
int num = 1024;
CString strNum;
strNum.Format(_T("%d"), num); //strNum="1024" 数字转字符串
strNum.Format(_T("%5d"), num); //strNum=" 1024" 5表示占用5位 不足5位高位补空格
strNum.Format(_T("%05d"), num); //strNum="01024" 5表示占用5位 0表示不足5位高位补0
long转换为CString的方法与上面相似,只需把%d改为%ld。
3、double转换为CString:
float num = 10.24;
CString strNum;
strNum.Format(_T("%f"), num);
//strNum="10.240000" 数字转字符串,f为六位小数
strNum.Format(_T("%.1f"), num);
//strNum="10.2" .1表示保留小数点后1位 多余部分四舍五入
strNum.Format(_T("%.4f"), num);
//strNum="10.2400" .4表示保留小数点后4位 多余部分四舍五入
strNum.Format(_T("%8.4f"), num);
//strNum=" 10.2400" 字符串一共8位(包括小数点)不足8位整数高位补空格 .4表示保留小数点后4位 小数多余部分四舍五入
strNum.Format(_T("%08.4f"), num);
//strNum="010.2400" 字符串一共8位(包括小数点)不足8位整数高位补0 .4表示保留小数点后4位 小数多余部分四舍五入
double转换为CString的方法与上面相似,将f%改为lf%就可以了。
4、将十进制数转换为八进制:
int num = 1024;
CString strNum;
strNum.Format(_T("%o"), num); //strNum="2000"
strNum.Format(_T("%08o"), num); //strNum="00002000"
5、特别的
5.1、补零
只要在[width]前加0即可
str.Format(_T("this is %6d"), 12); //str="this is 12"
str.Format(_T("this is %06d"), 12); //str="this is 000012"
5.2、对齐规则
当指定宽度大于要输出位数时,数右对齐,左端补空格,当前缀’-‘号时,想要数左对齐,右端补空格
前提:只有当“指定宽度”存在时,前缀’-'才有意义。
经验:一般来说,左端对齐的形式看上去要美观整齐一点。
5.3、输出正负号的技巧:
str.Format(_T("this is %+6d"), 12); //str="this is +12"
str.Format(_T("this is %+06d"), 12); //str="this is +00012"
只要在中间加个“+”号就行。作用是输出符号位(即,数的正负号)
如果不希望正数的前面出现‘+’号,只要在中间加个“ ”号(即:空格)就行。
这样如果一个数是非负数,就在它的前面插入一个空格。
如果‘+’和‘ ’同时出现在“中间”时,要以‘+’为准。 两个符号的共同点:用于对齐输出的数:(尤其对于小数来说)