2011-02-16 14 views
11

Me gustaría usar lexical_cast para convertir un flotador en una cadena. Normalmente funciona bien, pero tengo algunos problemas con los números sin decimales. ¿Cómo puedo arreglar el número de decimal que se muestra en la cadena?Conversión de doble a cadena con boost :: lexical_cast en C++?

Ejemplo:

double n=5; 
string number; 
number = boost::lexical_cast<string>(n); 

Resultado número es 5, necesito número 5.00.

Respuesta

27

De la documentación para boost lexical_cast:

Para conversiones más complejas, como los que la precisión o el formato necesitan un control más estricto de lo que se ofrece por el comportamiento predeterminado de lexical_cast, se recomienda el enfoque stringstream convencional. Donde las conversiones son numéricas a numéricas, numeric_cast puede ofrecer un comportamiento más razonable que lexical_cast.

Ejemplo:

#include <sstream> 
#include <iomanip> 

int main() { 
    std::ostringstream ss; 
    double x = 5; 
    ss << std::fixed << std::setprecision(2); 
    ss << x; 
    std::string s = ss.str(); 
    return 0; 
} 
3

Si necesita un formato complejo, utilizar std::ostringstream lugar. boost::lexical_cast es para "formateo simple".

std::string 
get_formatted_value(double d) { 
    std::ostringstream oss; 
    oss.setprecision(3); 
    oss.setf(std::ostringstream::showpoint); 
    oss << d; 
    return oss.str(); 
} 
1

también se puede utilizar sprintf, que es más rápido que ostringstream

#include <cstdio> 
#include <string> 

using namespace std; 

int main() 
{ 
    double n = 5.0; 

    char str_tmp[50]; 
    sprintf(str_tmp, "%.2f", n); 
    string number(str_tmp); 
} 
+2

Creo que significa snprintf :) – criddell

+2

No utilice 'using namespace std;' – AnotherParker

13

Tener un vistazo a la biblioteca impulso :: formato. Combina la usabilidad de printf con el tipo de seguridad de las transmisiones. Por velocidad, no lo sé, pero dudo que realmente importe hoy en día.

#include <boost/format.hpp> 
#include <iostream> 

int main() 
{ 
    double x = 5.0; 
    std::cout << boost::str(boost::format("%.2f") % x) << '\n'; 
} 
Cuestiones relacionadas