2008-12-01 10 views
134

Necesito almacenar un doble como una cadena. Sé que puedo usar printf si quisiera mostrarlo, pero solo quiero almacenarlo en una variable de cadena para poder almacenarlo en un mapa más tarde (como valor, no clave).¿Cómo convierto un doble en una cadena en C++?

+1

Por qué convertirlo en absoluto? Guárdelo en el mapa como un doble y evite la conversión hacia y desde. – EvilTeach

+0

Estoy almacenando cadenas en el mapa porque tengo múltiples tipos para validar y almacenar. –

+2

Eso todavía suena como una llamada para objetos. Una unión funcionaría. Cada uno el objeto para insertar varios valores en él, y tiene que validarse uno mismo. – EvilTeach

Respuesta

157

El impulso (tm) manera:

std::string str = boost::lexical_cast<std::string>(dbl); 

El estándar de C++ manera:

std::ostringstream strs; 
strs << dbl; 
std::string str = strs.str(); 

Nota: No se olvide #include <sstream>

+11

Gracias. Estoy usando la forma estándar de C++. –

+3

Creo que boost :: lexical_cast es prácticamente la forma estándar de C++, muy bien empaquetada para usted. Por cierto, litb, tienes un pequeño error tipográfico allí - "boot: lexical_cast". –

+2

boost :: lexical_cast no es solo una envoltura simple alrededor del código stringstream. Muchas de las rutinas de conversión se implementan en línea. De acuerdo con las mediciones de rendimiento en la parte inferior de esta página (http://www.boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm), boost :: lexical_cast es más rápido que el uso de cadenas de caracteres y, en la mayoría de casos, más rápido que scanf/printf – Ferruccio

0

Eche un vistazo a sprintf() y su familia.

+0

Dijo C++, no C. :) – jalf

+2

Pero mencionó printf. – Darron

+2

Mencioné printf porque googlear apareció un montón de artículos que dicen convertir de un doble a una cadena que usas printf. Suponen que lo único que podrías hacer es imprimir, lo que en mi caso es falso. –

153
// The C way: 
char buffer[32]; 
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar); 

// The C++03 way: 
std::ostringstream sstream; 
sstream << myDoubleVar; 
std::string varAsString = sstream.str(); 

// The C++11 way: 
std::string varAsString = std::to_string(myDoubleVar); 

// The boost way: 
std::string varAsString = boost::lexical_cast<std::string>(myDoubleVar); 
+1

Su forma de C++ no funcionará porque 'operator <<' devuelve un 'std :: ostream &' en lugar de 'stringstream &'. –

+0

Parece que mis cadenas de caracteres están un poco oxidadas, prefiero las formas antiguas. Corregido ahora (espero). –

+0

Tu código C me tiró al principio. Yo todavía te gano por dar alternativas correctas. –

23

Si usa C++, evite sprintf. Es un-C++ y tiene varios problemas. Stringstreams son el método de elección, preferentemente encapsulado como en Boost.LexicalCast que se puede hacer con bastante facilidad:

template <typename T> 
std::string to_string(T const& value) { 
    stringstream sstr; 
    sstr << value; 
    return sstr.str(); 
} 

Uso:

string s = to_string(42.5); 
4

Je, me acaba de escribir esto (sin relación con esta pregunta):

string temp = ""; 
stringstream outStream; 
double ratio = (currentImage->width*1.0f)/currentImage->height; 
outStream << " R: " << ratio; 
temp = outStream.str(); 

/* rest of the code */ 
9

sprintf está bien, pero en C++, la forma mejor, más segura y también un poco más lenta de hacer la conversión es con stringstream:

#include <sstream> 
#include <string> 

// In some function: 
double d = 453.23; 
std::ostringstream os; 
os << d; 
std::string str = os.str(); 

También puede utilizar Boost.LexicalCast:

#include <boost/lexical_cast.hpp> 
#include <string> 

// In some function: 
double d = 453.23; 
std::string str = boost::lexical_cast<string>(d); 

En ambos casos, debe ser str"453.23" después. LexicalCast tiene algunas ventajas en el sentido de que asegura que la transformación se complete. Utiliza stringstream s internamente.

6

El problema con lexical_cast es la imposibilidad de definir la precisión. Normalmente, si está convirtiendo un doble en una cadena, es porque desea imprimirlo. Si la precisión es demasiado o muy poca, afectaría su salida.

99

El estándar de C++ 11 manera (si no se preocupan por el formato de salida):

#include <string> 

auto str = std::to_string(42.5); 

to_string es una nueva función introducida en la biblioteca N1803 (R0), N1982 (r1) y N2408 (r2) "Simple Numeric Access". También existe la función stod para realizar la operación inversa.

Si desea tener un formato de salida diferente de "%f", utilice los métodos snprintf o ostringstream como se ilustra en otras respuestas.

+3

oh sí bebé. to_string y stod ambos funcionan en Visual Studio 11. – BSalita

+0

Oh querido bebé ... to_string no parece funcionar en VisualStudio 2010): Eso, o no sé lo que estoy haciendo (muy posible) – chessofnerd

+1

Esto debería ser ¡más alto, ya que es más moderno! – gsamaras

0

usted podría intentar un estilo más compacto:

std::string number_in_string; 

double number_in_double; 

std::ostringstream output; 

number_in_string = (dynamic_cast< std::ostringstream*>(&(output << number_in_double << 

std::endl)))->str(); 
9

me gustaría ver en el C++ String Toolkit Libary. Acabo de publicar una respuesta similar en otro lugar. Lo he encontrado muy rápido y confiable.

#include <strtk.hpp> 

double pi = M_PI; 
std::string pi_as_string = strtk::type_to_string<double>(pi); 
2

Normaly para estas operaciones se tienen que utilizar los ECVT, fcvt o gcvt Funciones:

/* gcvt example */ 
#include <stdio.h> 
#include <stdlib.h> 

main() 
{ 
    char buffer [20]; 
    gcvt (1365.249,6,buffer); 
    puts (buffer); 
    gcvt (1365.249,3,buffer); 
    puts (buffer); 
    return 0; 
} 

Output: 
1365.25 
1.37e+003 

como una función:

void double_to_char(double f,char * buffer){ 
    gcvt(f,10,buffer); 
} 
0

Uso to_string().
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); 
0

puede convertir cualquier cosa a cualquier cosa usando esta función:

template<class T = std::string, class U> 
T to(U a) { 
    std::stringstream ss; 
    T ret; 
    ss << a; 
    ss >> ret; 
    return ret; 
}; 

uso :

std::string str = to(2.5); 
double d = to<double>("2.5"); 
6

Puede utilizar std::to_string en C++ 11

double d = 3.0; 
std::string str = std::to_string(d); 
Cuestiones relacionadas