2011-02-25 13 views

risposta

17

usare sia 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); 

Questi lancerà un'eccezione boost::bad_lexical_cast se la stringa non può essere convertito.

L'altra opzione è quella di utilizzare Boost Qi (un sublibrary di 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 

Utilizzando Qi è molto più veloce di lexical_cast ma aumenterà i tempi di compilazione.

+4

E la gente sostiene che il C++ sia inutilmente complesso! –

3

Uso 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

Il migliore?

Se non si desidera utilizzare qualcosa di più che la libreria CRT, e sono felice con ottenere 0 se la stringa non può essere convertito, quindi è possibile salvare sulla gestione degli errori, sintassi complessa, tra cui intestazioni da

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

Tutto dipende da quello che stai facendo. Questo è il modo KISS!

+1

Da dove proviene '_wtof'? –

+0

@david Libreria c run time (CRT) – ravenspoint

+1

Non vedo alcun riferimento ad esso nello standard C99 o Harbison & Steele. Forse wcstod/wcstol/wcstoul sarebbe meglio. –

30

C++ 0x introduce il followingfunctions in <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 è un puntatore nullo opzionalmente alla fine della conversione entro str (impostata dalla funzione di conversione).

-1

Così stavo usando Embarcadero e quel pezzo di ..... non mi ha permesso di usare stoi, quindi devo creare la mia funzione.

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

basta usare lo stringstream: non dimenticate di #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; 
Problemi correlati