MFC中WString与string互相转换
std::string strTemp(pszDst);
delete [] pszDst;
return strTemp;
}
std::string ws2s(const std::wstring& inputws)
{
return WChar2Ansi(inputws.c_str());
}
//Converting a Ansi string to WChar string
std::wstring Ansi2WChar(const char* pszSrc, int nLen)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, (char*)pszSrc, nLen, 0, 0);
if(nSize <= 0)
return std::wstring(L"");
wchar_t *pwszDst = new wchar_t[nSize+1];
if( NULL == pwszDst)
return std::wstring(L"");
MultiByteToWideChar(CP_ACP, 0,(char*)pszSrc, nLen, pwszDst, nSize);
pwszDst[nSize] = 0;
if( pwszDst[0] == 0xFEFF) // skip Oxfeff
{
for(int i = 0; i < nSize; i ++)
{
pwszDst[i] = pwszDst[i+1];
}
}
std::wstring wcharString(pwszDst);
delete pwszDst;
return wcharString;
}
std::wstring s2ws(const std::string& s)
{
return Ansi2WChar(s.c_str(), (int)s.size());
}
事实上stdlib.h中提供了更方便的函数;
std::string ws2s(const wchar_t *source, int nCount)
{
char *sdata = new char[nCount + 1];
wcstombs(sdata, source, nCount);
sdata[nCount] = '/0';
string s(sdata);
delete []sdata;
return s;
}
数字与字符的转换:
可以使用atoi/atof将字符专程数字。而将数字转字符除了可以使用sprintf(),c++还可以使用stringstream,比如一个例子是:
using namespace std;
int main()
{
stringstream ss;
ss.setf(ios::fixed);
double d = 234234241.234567890123;
ss << d;
string str=ss.str();
cout << str;
cout.setf(ios::fixed);
cout << d;
return 0;
}
最后,如果要清空ss,只需要ss.str("")即可。
需要注意的是stringstream默认的精度只有7位,因此0.0000001就会被转换成0。为此,需要设置精度。
#include <limits>
int prec=numeric_limits<long double>::digits10; // 18
stringstream ss;
ss.precision(prec);//覆盖默认精度
P.S.
格式化标志: 使用setf(fmtflags)函数打开标志,使用unsetf(fmtflags)函数关闭标志
开/关标志 作用
ios::skipws 跳过空格(输入流的默认情况)
ios::showbase 打印整型值时指出数字的计数(比如,为dec、oct或hex),showbase标志处于开状态时,输入流也能识别前缀基数
ios::showpoint 显示浮点值的小数点并截断数字末尾的零
ios::uppercase 显示十六进制值时使用大写A~F,显示科学计数中的E
ios::showpos 显示正数前的加号(+)
ios::unitbuf “单元缓冲区”。每次插入后刷新流