将std :: wstring转换为数字类型的最佳方法是什么,例如int,long,float或double?
答案 0 :(得分:31)
C ++ 0x在<string>
中引入了following functions:
int stoi (const wstring& str, size_t* idx = 0, int base = 10);
long stol (const wstring& str, size_t* idx = 0, int base = 10);
unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10);
long long stoll (const wstring& str, size_t* idx = 0, int base = 10);
unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10);
float stof (const wstring& str, size_t* idx = 0);
double stod (const wstring& str, size_t* idx = 0);
long double stold(const wstring& str, size_t* idx = 0);
idx
是指向str
内转换结束的可选空指针(由转换函数设置)。
答案 1 :(得分:17)
#include <boost/lexical_cast.hpp>
std::wstring s1(L"123");
int num = boost::lexical_cast<int>(s1);
std::wstring s2(L"123.5");
double d = boost::lexical_cast<double>(s2);
如果无法转换字符串,这些将抛出boost::bad_lexical_cast
异常。
另一种选择是使用Boost Qi(Boost.Spirit的子库):
#include <boost/spirit/include/qi.hpp>
std::wstring s1(L"123");
int num = 0;
if (boost::spirit::qi::parse(s1.begin(), s1.end(), num))
; // conversion successful
std::wstring s2(L"123.5");
double d = 0;
if (boost::spirit::qi::parse(s1.begin(), s1.end(), d))
; // conversion successful
使用Qi比lexical_cast快得多,但会增加编译时间。
答案 2 :(得分:11)
最佳?
如果您不想使用除CRT库以外的任何内容,并且对于如果无法转换字符串感到满意,那么您可以节省错误处理,复杂语法,包括标题
std::wstring s(L"123.5");
float value = (float) _wtof( s.c_str() );
这完全取决于你在做什么。这是KISS的方式!
答案 3 :(得分:3)
使用wstringstream / stringstream:
#include <sstream>
float toFloat(const std::wstring& strbuf)
{
std::wstringstream converter;
float value = 0;
converter.precision(4);
converter.fill('0');
converter.setf( std::ios::fixed, std::ios::floatfield );
converter << strbuf;
converter >> value;
return value;
}
答案 4 :(得分:0)
只需使用stringstream:
不要忘记#include <sstream>
wchar_t blank;
wstring sInt(L"123");
wstring sFloat(L"123.456");
wstring sLong(L"1234567890");
int rInt;
float rFloat;
long rLong;
wstringstream convStream;
convStream << sInt<<' '<< sFloat<<' '<<sLong;
convStream >> rInt;
convStream >> rFloat;
convStream >> rLong;
cout << rInt << endl << rFloat << endl << rLong << endl;
答案 5 :(得分:-1)
所以我使用的是Embarcadero,那件.....并没有让我使用stoi,所以我必须创建自己的功能。
int string_int(wstring lala){
int numero;
int completo = 0;
int exponente = 1;
int l = 1;
for (int i = 0; i < lala.size(); i++){
numero = 0;
for (int j = 48; j < 57; j++){
if (lala[i] == j){
break;
}
numero++;
}
for (int k = 0; k < lala.size() - l; k++){
exponente *= 10;
}
numero *= exponente;
completo += numero;
exponente = 1;
l++;
}
return completo;
}