CString类型转换.docx
《CString类型转换.docx》由会员分享,可在线阅读,更多相关《CString类型转换.docx(18页珍藏版)》请在冰点文库上搜索。
CString类型转换
CString类型转换大全
CString型转化成int型
把CString类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程。
atoi()函数
假如你预备使用Unicode字符,你应该用_ttoi(),它在ANSI编码系统中被编译成_atoi(),而在Unicode编码系统中编译成_wtoi()。
你也可以考虑使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。
看下面的例子:
CStringhex=_T("FAB");
CStringdecimal=_T("4011");
ASSERT(_tcstoul(hex,0,16)==_ttoi(decimal));
在做DWORD与CString比较的时候,需要将CString转换成DWORD,有几种转换方法,但是明明转换结果是一样的,可就是提示不相等,后来_tcstoul()转换后才相等,记录下
CStringstr=lp->GetSubItem(nCol);
// MessageBox(str,m_strItem,MB_OK);
DWORDdwData=_tcstoul(str,NULL,10);//10进制
if(dwItem==dwData)
{
//AfxMessageBox("找到");
returnpCur;
}
使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。
看下面的例子:
CStringhex=_T("FAB");
CStringdecimal=_T("4011");
ASSERT(_tcstoul(hex,0,16)==_ttoi(decimal));
Format函数
VC++中Format函数详解
首先看它的声明:
functionFormat(constFormat:
string;constArgs:
arrayofconst):
string;overload;
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的, 但并不多用,所以这里只对第一个介绍:
functionFormat(constFormat:
string;constArgs:
arrayofconst):
string;overload;
Format参数是一个格式字符串,用于格式化Args里面的值的。
Args又是什么呢,
它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如以下例子:
Format("mynameis%6s","wind");
返回后就是
mynameiswind
现在来看Format参数的具体情况:
Format里面可以写普通的字符串,比如"mynameis"
但有些格式指令字符具有非凡意义,比如"%6s"
格式指令具有以下的形式:
"%"[index":
"]["-"][width]["."prec]type
它是以"%"开始,而以type结束,type表示一个具体的类型。
中间是用来
格式化type类型的指令字符,是可选的。
先来看看type,type可以是以下字符:
d 十制数,表示一个整型值
u 和d一样是整型值,但它是无符号的,而假如它对应的值是负的,则返回时
是一个2的32次方减去这个绝对值的数
如:
Format("thisis%u",-2);
返回的是:
thisis4294967294
f 对应浮点数
e 科学表示法,对应整型数和浮点数,
比如Format("thisis%e",-2.22);
返回的是:
thisis-2.220000E+000
等一下再说明假如将数的精度缩小
g 这个只能对应浮点型,且它会将值中多余的数去掉
比如Format("thisis%g",02.200);
返回的是:
thisis2.2
n 只能对应浮点型,将值转化为号码的形式。
看一个例子就明白了
Format("thisis%n",4552.2176);
返回的是thisis4,552.22
注重有两点,一是只表示到小数后两位,等一下说怎么消除这种情况 ,二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
m 钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
另外它只对应于浮点值
Format("thisis%m",9552.21);
返回:
thisis¥9,552.21
p 对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示
例如:
Format("thisis%p",p);
Edit1的内容是:
thisis0012F548
s 对应字符串类型,不用多说了吧
x 必须是一个整形值,以十六进制的形式返回
Format("thisis%X",15);
返回是:
thisisF
类型讲述完毕,下面介绍格式化Type的指令:
[index":
"] 这个要怎么表达呢,看一个例子
Format("thisis%d%d",12,13);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候 是这样 thisis1213
而假如你这样定义:
Format("thisis%1:
d%0:
d",12,13);
那么返回的字符串就变成了
thisis1312
现在明白了吗,[index":
"]中的index指示Args中参数显示的 顺序
还有一种情况,假如这样Format("%d%d%d%0:
d%d",1,2,3,4);
将返回12312。
假如你想返回的是12314,必须这样定:
Format("%d%d%d%0:
d%3:
d",1,2,3,4);
但用的时候要注重,索引不能超出Args中的个数,不然会引起异常
如Format("thisis%2:
d%0:
d",12,13);
由于Args中只有1213两个数,所以Index只能是0或1,这里为2就错了
[width] 指定将被格式化的值占的宽度,看一个例子就明白了
Format("thisis%4d",12);
输出是:
thisis12
这个是比较轻易,不过假如Width的值小于参数的长度,则没有效果。
如:
Format("thisis%1d",12);
输出是:
thisis12
["-"] 这个指定参数向左齐,和[width]合在一起最可以看到效果:
Format("thisis%-4d,yes",12);
输出是:
thisis12,yes
["."prec] 指定精度,对于浮点数效果最佳:
Format('thisis%.2f',['1.1234]);
输出thisis1.12
Format('thisis%.7f',['1.1234]);
输了thisis1.1234000
而对于整型数,假如prec比如整型的位数小,则没有效果
反之比整形值的位数大,则会在整型值的前面以0补之
Format('thisis%.7d',[1234]);
输出是:
thisis0001234]
对于字符型,刚好和整型值相反,假如prec比字符串型的长度大
则没有效果,反之比字符串型的长度小,则会截断尾部的字符
Format('thisis%.2s',['1234']);
输出是thisis12
而上面说的这个例子:
Format('thisis%e',[-2.22]);
返回的是:
thisis-2.22000000000000E+000
怎么去掉多余的0呢,这个就行啦
Format('thisis%.2e',[-2.22]);
好了,第一个总算讲完了,应该对他的应用很熟知了吧
///////////////////////////////////////////////////////////////
FormatDateTime的用法
他的声明为:
functionFormatDateTime(constFormat:
string;DateTime:
TDateTime):
string;
overload;
当然和Format一样还有一种,但这里只介绍常用的第一种
Format参数是一个格式化字符串。
DateTime是时间类型。
返回值是一种格式化后的
字符串
重点来看Format参数中的指令字符
c以短时间格式显示时间,即全部是数字的表示
FormatdateTime('c',now);
输出为:
2004-8-79:
55:
40
d对应于时间中的日期,日期是一位则显示一位,两位则显示两位
FormatdateTime('d',now);
输出可能为1~31
dd和d的意义一样,但它始终是以两位来显示的
FormatdateTime('dd',now);
输出可能为01~31
ddd显示的是星期几
FormatdateTime('ddd',now);
输出为:
星期六
dddd和ddd显示的是一样的。
但上面两个假如在其他国家可能不一样。
ddddd以短时间格式显示年月日
FormatdateTime('ddddd',now);
输出为:
2004-8-7
dddddd以长时间格式显示年月日
FormatdateTime('dddddd',now);
输出为:
2004年8月7日
e/ee/eee/eeee以相应的位数显示年
FormatdateTime('ee',now);
输出为:
04(表示04年)
m/mm/mmm/mmmm表示月
FormatdateTime('m',now);
输出为:
8
FormatdateTime('mm',now);
输出为08
FormatdateTime('mmm',now);
输出为八月
FormatdateTime('mmmm',now);
输出为八月
和ddd/dddd一样,在其他国家可能不同
yy/yyyy表示年
FormatdateTime('yy',now);
输出为04
FormatdateTime('yyyy',now);
输出为2004
h/hh,n/nn,s/ss,z/zzz分别表示小时,分,秒,毫秒
t以短时间格式显示时间
FormatdateTime('t',now);
输出为10:
17
tt以长时间格式显示时间
FormatdateTime('tt',now);
输出为10:
18:
46
ampm以长时间格式显示上午还是下午
FormatdateTime('ttampm',now);
输出为:
10:
22:
57上午
大概如此,假如要在Format中加普通的字符串,可以用双引号隔开那些
特定义的字符,这样普通字符串中假如含非凡的字符就不会被显示为
时间格式啦:
FormatdateTime('"todayis"c',now);
输出为:
todayis2004-8-710:
26:
58
时间中也可以加"-"或""来分开日期:
FormatdateTime('"todayis"yy-mm-dd',now);
FormatdateTime('"todayis"yymmdd',now);
输出为:
todayis04-08-07
也可以用":
"来分开时间
FormatdateTime('"todayis"hh:
nn:
ss',now);
输出为:
todayis10:
32:
23
/////////////////////////////////////////////////////////////////
FormatFloat的用法
常用的声明:
functionFormatFloat(constFormat:
string;Value:
Extended):
string;overload;
和上面一样Format参数为格式化指令字符,Value为Extended类型
为什么是这个类型,因为它是所有浮点值中表示范围最大的,假如传入该方法的参数
比如Double或者其他,则可以保存不会超出范围。
要害是看Format参数的用法
0这个指定相应的位数的指令。
比如:
FormatFloat('000.000',22.22);
输出的就是022.220
注重一点,假如整数部分的0的个数小于Value参数中整数的位数,则没有效果
如:
FormatFloat('0.00',22.22);
输出的是:
22.22
但假如小数部分的0小于Value中小数的倍数,则会截去相应的小数和位数
如:
FormatFloat('0.0',22.22);
输出的是:
22.2
也可以在整数0中指定逗号,这个整数位数必须大于3个,才会有逗号出句
FormatFloat('0,000.0',2222.22);
输出是:
2,222.2
假如这样FormatFloat('000,0.0',2222.22);
它的输出还是:
2,222.2
注重它的规律
#和0的用法一样,目前我还没有测出有什么不同。
FormatFloat('##.##',22.22);
输出是:
22.00
E科学表示法,看几个例子大概就明白了
FormatFloat('0.00E+00',2222.22);
输出是2.22E+03
FormatFloat('0000.00E+00',2222.22);
输出是2222.22E+00
FormatFloat('00.0E+0',2222.22);
22.2E+2
明白了吗,全靠E右边的0来支配的。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ANSI和UNICODE的函数对应表
ANSI UNICODE 通用
(char.h) (wchar.h) (tchar.h)
char wchar_t TCHAR
char* wchar_t* PTCHAR(PTSTR,LPWSTR,PWSTR,WCHAR)
printf wprintf _tprintf
scanf wscanf _tscanf
atoi _wtoi _ttoi
atol _wtol _ttol
itoa _itow _itot
ltoa _ltow _ltot
atof _wtof _tstof
strlen wcslen _tcslen
strcat wcscat _tcscat
strcpy wcscpy _tcscpy
strcmp wcscmp _tcscmp
ASCII
UNICODE
TCHAR
VS2005
int
atoi
_wtoi
_tstoi
_ttoi
_atoi_l
_wtoi_l
long
atol
_wtol
_tstoi
_ttoi
_atoi_l
_wtoi_l
__int64
_atoi64
_wtoi64
_tstoi64
_ttoi64
_atoi64_l
_wtoi64_l
float
_atoflt
_atoflt_l
double
atof
_wtof
_tstof
_ttof
_atof_l
_wtof_l
_atodbl
_atodbl_l
longdouble
_atoldbl
_atoldbl_l
atof,_atof_l,_wtof,_wtof_l
Convertstringtofloat
atoi,_atoi_l,_wtoi,_wtoi_l
Convertstringtoint
_atoi64,_atoi64_l,_wtoi64,_wtoi64_l
Convertstringto__int64
atol,_atol_l,_wtol,_wtol_l
Convertstringtolong
_ecvt,_ecvt_s
Convertdoubletostringofspecifiedlength
_fcvt,_fcvt_s
Convertdoubletostringwithspecifiednumberofdigitsfollowingdecimalpoint
_gcvt,_gcvt_s
Convertdoublenumbertostring;storestringinbuffer
_itoa,_i64toa,_ui64toa,_itow,_i64tow,_ui64tow,_itoa_s,_i64toa_s,_ui64toa_s,_itow_s,_i64tow_s,_ui64tow_s
Convertintor__int64tostring
_ltoa,_ltow,_ltoa_s,_ltow_s
Convertlongtostring
strtod,_strtod_l,wcstod,_wcstod_l
Convertstringtodouble
strtol,wcstol,_strtol_l,_wcstol_l
Convertstringtolonginteger
strtoul,_strtoul_l,wcstoul,_wcstoul_l
Convertstringtounsignedlonginteger
_ultoa,_ultow,_ultoa_s,_ultow_s
Convertunsignedlongtostring
atof,_atof_l,_wtof,_wtof_l
Convertwide-characterstringtoadouble
atoi,_atoi_l,_wtoi,_wtoi_l
Convertwide-characterstringtoint
_atoi64,_atoi64_l,_wtoi64,_wtoi64_l
Convertwide-characterstringto__int64
atol,_atol_l,_wtol,_wtol_l
Convertwide-characterstringtolong
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,假如表达式为FALSE (0), 程序将报告错误,并终止执行。
假如表达式不为0,则继续执行后面的语句。
这个宏通常原来判定程序中是否出现了明显非法的数据,假如出现了终止程序以免导致严重后果,同时也便于查找错误。
ASSERT只有在Debug版本中才有效,假如编译为Release版本则被忽略。
---------------------------------------------------------------
ASSERT宏定义如下
#define ASSERT(f) \
do \
{ \
if (!
(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
AfxDebugBreak(); \
} while (0) \
ASSERT(逻辑表达式)
假如括号中的逻辑表达式值为假的话,会弹出调试命令窗口,提示具体在哪个文件的哪一行发生了断言错误!
---------------------------------------------------------------