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++?
Respuesta
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>
Gracias. Estoy usando la forma estándar de C++. –
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". –
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
Eche un vistazo a sprintf()
y su familia.
También podría usar stringstream.
// 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 de C++ no funcionará porque 'operator <<' devuelve un 'std :: ostream &' en lugar de 'stringstream &'. –
Parece que mis cadenas de caracteres están un poco oxidadas, prefiero las formas antiguas. Corregido ahora (espero). –
Tu código C me tiró al principio. Yo todavía te gano por dar alternativas correctas. –
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);
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 */
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.
Herb Sutter tiene un excelente article on string formatting . Recomiendo leerlo Tengo linked it before en SO.
Esto no es una respuesta, pero haría un comentario muy útil sobre la pregunta. –
Para el registro: En mi propio código, que favorecen snprintf(). Con una matriz de caracteres en la pila local, no es tan ineficiente. (Bueno, tal vez si excedió el tamaño de la matriz y realizó un bucle para hacerlo dos veces ...)
(También lo envolví mediante vsnprintf(). Pero eso me cuesta algo de comprobación. Yelp si quiere el código ...)
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.
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.
oh sí bebé. to_string y stod ambos funcionan 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
Esto debería ser ¡más alto, ya que es más moderno! – gsamaras
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();
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);
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);
}
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);
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");
Puede utilizar std::to_string en C++ 11
double d = 3.0;
std::string str = std::to_string(d);
- 1. Objective-C, ¿cómo convierto un doble en un int?
- 2. ¿Cómo convierto un CString a un doble en C++?
- 3. ¿Cómo convierto una cadena en un char * en C++?
- 4. ¿Cómo convierto un largo en una cadena en C++?
- 5. ¿Cómo convierto una cadena a un tipo int en C#?
- 6. ¿Cómo convierto nchar en cadena en C#?
- 7. ¿Cómo convierto una cadena en byte en C#?
- 8. OCaml - ¿Cómo convierto int en una cadena?
- 9. ¿Cómo convierto una cadena binaria en un número en Perl?
- 10. ¿Cómo convierto un entero en una cadena en Excel VBA?
- 11. En Erlang, ¿cómo convierto una Cadena en un valor binario?
- 12. ¿Cómo convierto una cadena en un buffer en Python 3.1?
- 13. ¿Cómo convierto una cadena de caracteres en una cadena wchar_t?
- 14. ¿Cómo convierto una cadena hexadecimal en un entero con signo?
- 15. ¿Cómo convierto un objeto org.w3c.dom.Document en una Cadena?
- 16. ¿Cómo convierto un InputStream a una cadena en Java?
- 17. ¿Cómo convierto un objeto Rails DateTime en una cadena XML?
- 18. Cómo convierto un nombre de función en una cadena
- 19. ¿Cómo convierto un UIColor en una cadena hexadecimal?
- 20. Coffeescript: ¿cómo convierto una cadena en un número?
- 21. ¿Cómo convierto una cadena en un método de clase?
- 22. ¿Cómo convierto una cadena en una representación en minúsculas?
- 23. ¿Cómo convierto una cadena en una lista en Io?
- 24. ¿Cómo convierto StreamReader a una cadena?
- 25. ¿Cómo convierto una cadena en un número entero en el objetivo C?
- 26. Conversión de doble a cadena en C++
- 27. Cómo obtener un doble de una cadena
- 28. ¿Cómo convierto una matriz de bytes en una cadena?
- 29. ¿Cómo convierto una cadena ISO 8601 en una Delphi TDate?
- 30. ¿Cómo convierto caracteres de cadena en una lista?
Por qué convertirlo en absoluto? Guárdelo en el mapa como un doble y evite la conversión hacia y desde. – EvilTeach
Estoy almacenando cadenas en el mapa porque tengo múltiples tipos para validar y almacenar. –
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