(一)、使用CRT库中的转换函数族。
_itoa, _itow 及其反转换 atoi, _wtoi
_ltoa, _ltow 及其反转换 atol, _wtol
_ultoa, _ultow
_ecvt, _fcvt, _gcvt 及其反转换
_atodbl, _atoldbl,_atoflt
...(太多了,不想写了)
使用此方法的优点:是C标准库中函数,现成可用且可移植(部分为平台相关)。
缺点:转换函数较多,命名不统一以致难以记住,使用不方便。
(二)、借助C++98标准中的stringstream模板类实现。
数值到字符串的转换可如下实现:
template<typenameCharT,typenameNumericT> basic_string<CharT>Numeric2String(NumericTnum) { basic_ostringstream<CharT>oss; oss<<num; returnoss.str(); } |
stringstr=Numeric2String<char>(10); wstringwstr=Numeric2String<wchar_t>(10.1f); |
template<typenameNumericT,typenameCharT> NumericTString2Numeric(constbasic_string<CharT>&str) { basic_istringstream<CharT>iss(str); NumericTresult; iss>>result; returnresult; } |
template<typenameNumericT,typenameCharT> NumericTString2Numeric(constCharT*str) { basic_istringstream<CharT>iss(str); NumericTresult; iss>>result; returnresult; } |
template<typenameNumericT,typenameStringT> NumericTString2Numeric(constStringT&str) { basic_istringstream<??????>iss(str); ... } |
此方法的优点:转换函数少,容易记住,使用方便。
缺点:模板编程对于C++初学者来说有难度,需手工实现。
(三)、使用第三方库。
例如boost中的lexical_cast模板:
stringstr=lexical_cast<string>(10); inti=lexical_cast<int>("20"); |
使用此种方法的优点:功能强大且稳定,仅有唯一的转换接口。
缺点:需学习研究方能使用。
(四)、使用sprintf、sscanf。
其函数原型为:
intsprintf(char*buffer,constchar*format[,argument]...); intswprintf(wchar_t*buffer,size_tcount,constwchar_t*format[,argument]...); intsscanf(constchar*buffer,constchar*format[,argument]...); intswscanf(constwchar_t*buffer,constwchar_t*format[,argument]...); |
charbuf[2]; sprintf(buf,"%d",1000);//ooh.Compile-Ok charbuf2[20]; sprintf(buf2,"%s",1000);//ooh.Compile-Ok |