Necesito almacenar un doble como una cadena. Sé que puedo usar printfsi quisiera mostrarlo, pero solo quiero almacenarlo en una variable de cadena para poder almacenarlo en un mapa más tarde (como el valor , no la clave ).
Una pregunta para responder a su pregunta: ¿por qué está almacenando el valor doble en una cadena para almacenarlo en un mapa? ¿Vas a usar el doble de cadena como clave? Si no, ¿por qué no dejar el doble como está?
Matt McClellan
1
Punto interesante Sin embargo, usar un doble como clave de mapa puede estar lleno de peligros, ya que las comparaciones exactas de los valores de coma flotante siempre lo son. La indexación en una representación de cadena evita el problema.
Fred Larson
2
¿Por qué convertirlo? Guárdelo en el mapa como un doble y evite la conversión hacia y desde.
EvilTeach
3
Eso todavía suena como una llamada a objetos. Un sindicato funcionaría. Cada uno de los objetos para insertar varios valores en él, y hacer que se autovalide.
EvilTeach
2
Solo tengo un montón de pares de nombre / valor en un archivo. No requiere objetos.
Creo que boost :: lexical_cast es la forma estándar de C ++, muy bien empaquetado para ti. Por cierto, litb, tienes un error tipográfico menor allí: "boot: lexical_cast".
Fred Larson
2
boost :: lexical_cast no es solo un simple contenedor alrededor del código de secuencia de cadena. 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 ( 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 y, en la mayoría de los casos, más rápido que scanf / printf
Ferruccio
1
@Ferr, ¿quién dijo que era una simple envoltura? Y gracias por proporcionar el enlace, en realidad hicieron pensar que era más o menos un contenedor simple :)
Johannes Schaub - litb
27
no te olvides #include <sstream>de la forma c ++ :)
VladL
3
En aras de la documentación, si no lo hace #include <sstream>, recibirá un error "no se permite el tipo incompleto".
Trevor Sullivan
194
// 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);
Su forma C ++ no funcionará porque operator <<devuelve un en std::ostream&lugar de un stringstream&.
Konrad Rudolph el
Parece que mis cadenas están un poco oxidadas, prefiero las formas antiguas. Solucionado ahora (espero).
Adam Rosenfield
Tu código C me arrojó al principio. Todavía te voté por dar alternativas correctas.
Bill the Lizard el
2
voto a favor por incluir la forma C. me parece mucho más limpio.
Nealon
11
Votado a favor de la forma C ++ 11. Soy nuevo en C ++ y no me di cuenta de que había una to_stringfunción. Estoy usando Microsoft Visual C ++ 2013.
Trevor Sullivan
123
La forma estándar de C ++ 11 (si no le importa el formato de salida):
#include<string>auto str = std::to_string(42.5);
to_stringes una nueva función de biblioteca introducida en N1803 (r0), N1982 (r1) y N2408 (r2) " Acceso numérico simple ". También están losstod función para realizar la operación inversa.
Si desea tener un formato de salida diferente que "%f", use los métodos snprintfo ostringstreamcomo se ilustra en otras respuestas.
Oh si bebé. to_string y stod ambos trabajan en Visual Studio 11.
BSalita
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
1
¿Hay alguna forma de hacer que esta función no agregue más decimales de los necesarios? Cuando convierto el doble 8.0, me da la cadena "8.000000", mientras "8"que estaría perfectamente bien.
HelloGoodbye
1
Esto no funciona para números pequeños ... por ejemplo: 1e-9 produce0.000000
user3728501
24
Si usa C ++, evítelo sprintf. No es C ++ y tiene varios problemas. Los Stringstreams son el método de elección, preferiblemente encapsulado como en Boost.LexicalCast que se puede hacer con bastante facilidad:
#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, strdebe ser "453.23"posterior. LexicalCast tiene algunas ventajas, ya que garantiza que la transformación se complete. Utiliza stringstreams internamente.
Esta no es una respuesta, pero haría un comentario muy útil sobre la pregunta.
Expiación limitada el
6
El problema con lexical_cast es la incapacidad para 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 poco, afectaría su salida.
Para el registro: en mi propio código, estoy a favor de snprintf (). Con una matriz de caracteres en la pila local, no es tan ineficiente. (Bueno, tal vez si superaste el tamaño de la matriz y lo hiciste dos veces ...)
(También lo envié a través de vsnprintf (). Pero eso me cuesta un poco de verificación de tipos. Yelp si quieres el código ...)
Mencioné printf porque googleó apareció un montón de artículos que dicen que para convertir de un doble a una cadena usas printf. Asumen que lo único que podría estar haciendo es imprimir, que en mi caso es falso.
Bill the Lizard el
¿Por qué votas -1? Creo que sprintf es bueno. @BilltheLizard, sprint imprime algo en un char * no en la pantalla. Alguien respondió que el método c todavía tenía mucho voto.
Worldterminator
2
Normalmente para estas operaciones, debe usar las funciones ecvt, fcvt o gcvt:
/* 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);return0;}Output:1365.251.37e+003
Respuestas:
La forma de impulso (tm) :
La forma estándar de C ++ :
Nota : no olvides
#include <sstream>
fuente
#include <sstream>
de la forma c ++ :)#include <sstream>
, recibirá un error "no se permite el tipo incompleto".fuente
operator <<
devuelve un enstd::ostream&
lugar de unstringstream&
.to_string
función. Estoy usando Microsoft Visual C ++ 2013.La forma estándar de C ++ 11 (si no le importa el formato de salida):
to_string
es una nueva función de biblioteca introducida en N1803 (r0), N1982 (r1) y N2408 (r2) " Acceso numérico simple ". También están losstod
función para realizar la operación inversa.Si desea tener un formato de salida diferente que
"%f"
, use los métodossnprintf
oostringstream
como se ilustra en otras respuestas.fuente
8.0
, me da la cadena"8.000000"
, mientras"8"
que estaría perfectamente bien.1e-9
produce0.000000
Si usa C ++, evítelo
sprintf
. No es C ++ y tiene varios problemas. Los Stringstreams son el método de elección, preferiblemente encapsulado como en Boost.LexicalCast que se puede hacer con bastante facilidad:Uso:
fuente
Puede usar std :: to_string en C ++ 11
fuente
std::to_string()
simplemente devolvieron 0.000000 y no en forma científica.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 constringstream
:También puedes usar Boost.LexicalCast :
En ambos casos,
str
debe ser"453.23"
posterior. LexicalCast tiene algunas ventajas, ya que garantiza que la transformación se complete. Utilizastringstream
s internamente.fuente
Me gustaría ver el C ++ String Toolkit Libary . Acabo de publicar una respuesta similar en otro lugar. Lo he encontrado muy rápido y confiable.
fuente
Herb Sutter tiene un excelente artículo sobre el formato de cadenas . Recomiendo leerlo Lo he vinculado antes en SO.
fuente
El problema con lexical_cast es la incapacidad para 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 poco, afectaría su salida.
fuente
También puedes usar stringstream .
fuente
Je, acabo de escribir esto (sin relación con esta pregunta):
fuente
Es posible que desee leer mi publicación anterior en SO. (Versión macro'ed con un objeto ostringstream temporal).
Para el registro: en mi propio código, estoy a favor de snprintf (). Con una matriz de caracteres en la pila local, no es tan ineficiente. (Bueno, tal vez si superaste el tamaño de la matriz y lo hiciste dos veces ...)
(También lo envié a través de vsnprintf (). Pero eso me cuesta un poco de verificación de tipos. Yelp si quieres el código ...)
fuente
Echa un vistazo
sprintf()
y familia.fuente
Normalmente para estas operaciones, debe usar las funciones ecvt, fcvt o gcvt:
Como una función:
fuente
Podrías probar un estilo más compacto:
fuente
Uso
to_string()
.ejemplo:
ejecútelo usted mismo: http://ideone.com/7ejfaU
Estos también están disponibles:
fuente
Puedes convertir cualquier cosa a cualquier cosa usando esta función:
uso:
fuente