2011-02-25 26 views

Respuesta

17

De cualquier uso 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); 

Estos arrojará una excepción boost::bad_lexical_cast si la cadena no se puede convertir.

La otra opción es usar Boost Qi (una sub-biblioteca de 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 

Usando Qi es mucho más rápido que lexical_cast pero aumentará su tiempo de compilación.

+4

¡Y la gente dice que C++ es innecesariamente complejo! –

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

¿Mejor?

Si no desea usar nada más que la biblioteca CRT, y está satisfecho con la obtención de 0 si la cadena no se puede convertir, entonces se puede ahorrar en la gestión de errores, la sintaxis compleja, incluyendo encabezados por

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

Todo depende de lo que esté haciendo. Esta es la manera de KISS!

+1

¿De dónde viene '_wtof'? –

+0

@david La biblioteca de tiempo de ejecución c (CRT) – ravenspoint

+1

No veo ninguna referencia en el estándar C99 ni en Harbison & Steele. Tal vez wcstod/wcstol/wcstoul sería mejor. –

30

C++ 0x introduce el followingfunctions en <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 es un puntero opcionalmente nulo al final de la conversión dentro de str (establecido por la función de conversión).

-1

Así que estaba usando Embarcadero y esa pieza de ..... no me dejó usar stoi, así que tengo que crear mi propia función.

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

sólo tiene que utilizar el stringstream: no se olvide de #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;