none
C++ Convertir un const char * en double

    Question

  • Hola
    Estoy trabajando en C++ VS 2005 y tengo el siguiente problema: tengo una variable que es de tipo string ó const char *. Esta contiene un nombre de una persona.
    Necesito convertir esta variable en double. Como puedo hacer esto? he tratado de hacer esto con strtod, strtol, atoi, atof pero no funciona.
    Este es un ejemplo:

    string nombre;
    nombre = "carlos";
    const char* ConsNombre = nombre.c_str(); //Aqui convierto el string en const char*

    //Ahora necesito convertie ConsNombre en double
    ???

    Te agradezco si me puedes ayudar
    Basslawrence
    Tuesday, February 02, 2010 5:10 PM

All replies

  • Las funciones strtod, strol, ... sólo funcionan si la cadena en cuestión representa a un número. Si la cadena tiene carácteres arbitrarios no lo puede pasar a double, no tiene sentido.

    Te tendrás que hacer tu función a mano. y tendras que responderte, como mínimo a dos preguntas previas:
    ¿posteriormente tendrás que pasar de double a cadena?
    ¿Dos cadenas diferentes pueden dar el mismo double?

    Una posible solución, si las respuestas son no-si:

    double DeCadenaADouble(const char *Cadena)
    {
    double Num=1.0;
    while (*Cadena)
        Num *= *(Cadena++); // cualquier operación matemática que se te ocurra
    return Num;
    }
    Wednesday, February 03, 2010 6:55 AM
  • Usa stringstream (de todas maneras, convertir "carlos" a double es algo sin sentido no?):

    #include <sstream>
    ...

    std::string strValor = "124.4";
    ...

    std::stringstream ss;
    ss << strValor;

    double dValor(0.0);
    ss >> dValor;


    Saludos

    --
    Cholo Lennon
    Bs.As.
    ARG


    Wednesday, February 03, 2010 4:14 PM

  • sopita Reply:
         "Usa stringstream (de todas maneras, convertir "carlos" a double es algo sin sentido no?)"

     *((double *)"carlos\0")

    o por qué no

    *((double *)"carl\0os")

    ó

    *((double *)L"carlos")

    ó...
    ¿Y cual es el sentido de estas conversiones? Son 2 cosas totalmente sin relación, a menos claro que la cadena contenga un numero y si esto es asi el casting C que estas usando hace cualquier cosa menos convertir el numero en cadena a su equivalente double.

    Saludos

    --
    Cholo Lennon
    Bs.As.
    ARG


    Wednesday, February 03, 2010 4:34 PM

  • ¿Y cual es el sentido de estas conversiones? Son 2 cosas totalmente sin relación, a menos claro que la cadena contenga un numero y si esto es asi el casting C que estas usando hace cualquier cosa menos convertir el numero en cadena a su equivalente double.

    Saludos

    --
    Cholo Lennon
    Bs.As.
    ARG


    Se me ocurre que por ejemplo quiera cifrar el nombre en base a algún algoritmo matemático sin tener en cuenta qué hay escrito...

    Por cierto, bienvenido por estos lares, y a ver si te pasas más a menudo, que responder prácticamente solo es muy aburrido.

    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    Monday, February 08, 2010 5:11 PM
    Moderator

  • ¿Y cual es el sentido de estas conversiones? Son 2 cosas totalmente sin relación, a menos claro que la cadena contenga un numero y si esto es asi el casting C que estas usando hace cualquier cosa menos convertir el numero en cadena a su equivalente double.

    Saludos

    --
    Cholo Lennon
    Bs.As.
    ARG


    Se me ocurre que por ejemplo quiera cifrar el nombre en base a algún algoritmo matemático sin tener en cuenta qué hay escrito...

    Por cierto, bienvenido por estos lares, y a ver si te pasas más a menudo, que responder prácticamente solo es muy aburrido.

    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    Hola RFOG :-)

    Digamos que esas conversiones son hilar muy fino por no decir que son buscarle la 5ta pata al gato (aunque tienes razon en lo que dices). Creo que no hacen a la pregunta original (que por cierto me parece errada, pero como el OP no aclara mas sobre el tema es especular). De hecho la conversion:

    *((double *)"carlos\0")

    Está justo en el limite, un nombre o palabra con una letra de mas y seguro tenemos un "access violation" ya que un double tiene solo 8 bytes. Por otro lado no se porque la persona que publico dicha respuesta borro su post.

    Gracias por la bienvenida :-)  aunque no creo que ande mucho por aca, ya que me parece muy incomodo este tipo de foro web. Usar el browser no me gusta, perfiero el los servidores de noticias a la vieja usanza con un news-reader. Esta claro que MS hace rato trata de "mover" todos sus newsgroups a las "communities" pero mientras existan estare en el otro (oscuro?) lado.

    Salu2

    --
    Cholo Lennon
    Bs.As.
    ARG

    Monday, February 08, 2010 6:40 PM
  • Coñe, se me había pasado lo del desbordamiento, aunque con asignar un buffer múltiplo del double... 

    De todos modos como bien dices, me parece bastante retórica para la pregunta.

    Bueno, Cholo, ya sabes que andamos por aquí. Respecto a los grupos nntp, en este momento están experimentando ciertos problemas (mensajes que desaparecen) que espero MS solucione pronto.

    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    Monday, February 15, 2010 11:34 AM
    Moderator
  • Gracias por la bienvenida :-)  aunque no creo que ande mucho por aca, ya que me parece muy incomodo este tipo de foro web. Usar el browser no me gusta, perfiero el los servidores de noticias a la vieja usanza con un news-reader. Esta claro que MS hace rato trata de "mover" todos sus newsgroups a las "communities" pero mientras existan estare en el otro (oscuro?) lado.

    Hola Cholo,

    Microsoft Connect tiene el NNTP Bridge para que puedas utilizar los foros MSDN desde la comodidad de tu lector de newsgroups favorito. Yo lo acabo de instalar, es un poquito engorroso y es un programa aparte que debe estar corriendo, similar al Live Messenger, y he de decir que todavía no le agarro la onda al cien por cien. Espero te sirva. 

    Saludos. 


    Fernando Gómez
    www.fermasmas.com
    Friday, March 05, 2010 12:01 AM
  • Por ejemplo, este es un mensaje desde NNTP Bridge…



    :P







    From: Cholo Lennon [mailto:=?utf-8?B?Q2hvbG8gTGVubm9u?=]
    Posted At: lunes, 08 de febrero de 2010 12:40 p.m.
    Posted To: Msdn.es-ES.vcppes
    Conversation: C++ Convertir un const char * en double
    Subject: Re: C++ Convertir un const char * en double





    ¿Y cual es el sentido de estas conversiones? Son 2 cosas totalmente sin
    relación, a menos claro que la cadena contenga un numero y si esto es asi
    el casting C que estas usando hace cualquier cosa menos convertir el
    numero en cadena a su equivalente double.


    Saludos

    --
    Cholo Lennon
    Bs.As.
    ARG



    Se me ocurre que por ejemplo quiera cifrar el nombre en base a algún
    algoritmo matemático sin tener en cuenta qué hay escrito...



    Por cierto, bienvenido por estos lares, y a ver si te pasas más a menudo,
    que responder prácticamente solo es muy aburrido.

    ________________________________

    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    Hola RFOG :-)

    Digamos que esas conversiones son hilar muy fino por no decir que son
    buscarle la 5ta pata al gato (aunque tienes razon en lo que dices). Creo
    que no hacen a la pregunta original (que por cierto me parece errada, pero
    como el OP no aclara mas sobre el tema es especular). De hecho la
    conversion:

    *((double *)"carlos\0")

    Está justo en el limite, un nombre o palabra con una letra de mas y seguro
    tenemos un "access violation" ya que un double tiene solo 8 bytes. Por
    otro lado no se porque la persona que publico dicha respuesta borro su
    post.

    Gracias por la bienvenida :-) aunque no creo que ande mucho por aca, ya
    que me parece muy incomodo este tipo de foro web. Usar el browser no me
    gusta, perfiero el los servidores de noticias a la vieja usanza con un
    news-reader. Esta claro que MS hace rato trata de "mover" todos sus
    newsgroups a las "communities" pero mientras existan estare en el otro
    (oscuro?) lado.

    Salu2

    --
    Cholo Lennon
    Bs.As.
    ARG




    Fernando Gómez
    www.fermasmas.com
    Friday, March 05, 2010 12:13 AM