MFC中WString与string互相转换
- //Converting a WChar string to a Ansi string
- std::string WChar2Ansi(const wchar_t* pwszSrc)
- {
- int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
- if (nLen<= 0)
- return std::string("");
- char* pszDst = new char[nLen];
- if (NULL == pszDst)
- return std::string("");
- WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
- pszDst[nLen -1] = 0;
- 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中提供了更方便的函数;
- #include <cstdlib>
- std::wstring s2ws(const char* source, int nCount)
- {
- wchar_t* wdata = new wchar_t[nCount + 1];
- int n = mbstowcs(wdata, source, nCount);
- wdata[nCount] = L'/0';
- wstring ws(wdata);
- delete []wdata;
- return ws;
- }
- 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,比如一个例子是:
- #include <string>
- #include <sstream>
- #include <iostream>
- 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 “单元缓冲区”。每次插入后刷新流