2011-02-25 244 views

回答

17

要麼使用boost::lexical_cast<>

#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.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 

使用齊比lexical_cast的快得多,但會增加你的編譯時間。

+4

而人們聲稱C++是非常複雜的! – 2011-02-25 14:51:15

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; 
} 
11

最好?

如果你不希望使用任何超過CRT庫,並樂意與得到0如果字符串不能轉換,那麼你可以在錯誤處理,複雜的語法,包括標題由

std::wstring s(L"123.5"); 
float value = (float) _wtof(s.c_str()); 
保存

這一切都取決於你在做什麼。這是KISS的方式!

+1

'_wtof'從哪裏來? – 2011-02-25 15:08:34

+0

@david c運行時間(CRT)庫 – ravenspoint 2011-02-25 15:27:33

+1

我沒有在C99標準或Harbison&Steele中看到它的參考。也許wcstod/wcstol/wcstoul會更好。 – 2011-02-25 15:50:12

30

的C++ 0x介紹followingfunctions<string>

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

所以我使用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; 
} 
0

只使用字符串流: 不要忘記#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;