2010-01-24 28 views
47

que tiene un valor flotante que debe ser puesto en un std::string. ¿Cómo convierto de float a string?Convertir flotador para std :: string en C++

float val = 2.5; 
std::string my_val = val; // error here 
+4

considerar leer el artículo de Herb Sutter "Los formateadores de Cuerda de Manor Farm" (http://www.gotw.ca/publications /mill19.htm). Proporciona ejemplos de cinco de las formas más comunes de formatear cosas y analiza sus ventajas y desventajas. –

Respuesta

42

A menos que usted está preocupado por el rendimiento, utilice string streams:

std::ostringstream ss; 
ss << myFloat; 
std::string s(ss.str()); 

Si estás de acuerdo con Boost, lexical_cast<> es una alternativa conveniente:

std::string s = boost::lexical_cast<std::string>(myFloat); 

alternativas eficientes son, por ejemplo, FastFormat o simplemente las funciones estilo C.

+0

Esta será una solución adecuada teniendo en cuenta que estas funciones se llamarán raramente (redimensionando la ventana), pero ¿hay un método más eficiente? –

+1

Y si no está de acuerdo con Boost, escriba su propia función de conversión léxica; son aproximadamente cinco líneas de código y constituyen una función de biblioteca muy útil (ver http://www.gotw.ca/publications/mill19.htm para la implementación básica). –

2

Si está preocupado por el rendimiento, echa un vistazo a la biblioteca Boost::lexical_cast.

+9

Creo que quieres decir "si * no * te preocupa el rendimiento". 'boost :: lexical_cast' es la solución más pesada que puedes elegir. – Tom

14

Se puede definir una plantilla que trabajará no sólo acaba con dobles, pero con otros tipos también.

template <typename T> string tostr(const T& t) { 
    ostringstream os; 
    os<<t; 
    return os.str(); 
} 

Luego puede usarlo para otros tipos.

double x = 14.4; 
int y = 21; 

string sx = tostr(x); 
string sy = tostr(y); 
87

Como de C++ 11, la biblioteca estándar de C++ proporciona la función std::to_string(arg) con varios tipos soportados para arg.

+2

Tenga en cuenta el posible comportamiento inesperado de std :: to_string() cuando se trabaja con flotantes. (Vea el resultado de ejemplos en este enlace http://en.cppreference.com/w/cpp/string/basic_string/to_string). –

+0

este merece ser promovido a la mejor respuesta porque la mayoría AMBIENTE acumulación tendría soporte para C++ 11 ya – deddebme

0

This tutorial da un simple, pero elegante, solución, que transcribo:

#include <sstream> 
#include <string> 
#include <stdexcept> 

class BadConversion : public std::runtime_error { 
public: 
    BadConversion(std::string const& s) 
    : std::runtime_error(s) 
    { } 
}; 

inline std::string stringify(double x) 
{ 
    std::ostringstream o; 
    if (!(o << x)) 
    throw BadConversion("stringify(double)"); 
    return o.str(); 
} 
... 
std::string my_val = stringify(val); 
8

Uso to_string(). (Disponible desde C++ 11)
ejemplo:

#include <iostream> 
#include <string> 

using namespace std; 
int main() 
{ 
    string pi = "pi is " + to_string(3.1415926); 
    cout<< "pi = "<< pi << endl; 

    return 0; 
} 

plazo usted mismo: http://ideone.com/7ejfaU
Estos están disponibles, así:

string to_string (int val); 
string to_string (long val); 
string to_string (long long val); 
string to_string (unsigned val); 
string to_string (unsigned long val); 
string to_string (unsigned long long val); 
string to_string (float val); 
string to_string (double val); 
string to_string (long double val); 
+1

conocimiento de cualquier posible comportamiento inesperado de std :: to_string() cuando se trabaja con los flotadores. (Vea el resultado de ejemplos en este enlace http://en.cppreference.com/w/cpp/string/basic_string/to_string). –

2

Puede utilizar std::to_string en C++ 11

float val = 2.5; 
std::string my_val = std::to_string(val); 
+1

Encabeza, no copia respuestas copy-paste-submit-grace_period_edit. copiar-pegar-editar-enviarlos. En su lugar, obtenemos una bandera automática. Cuídate la próxima vez. Aclamaciones –

Cuestiones relacionadas