Question

Je suis en train d'essayer de prendre une chaîne ( « 0,1 ») et le convertir en un double en C ++ dans Xcode sur 10,6 avec gcc4.2.

J'utilise une fonction que je pincé de autre question , mais lorsque je tente d'utiliser la fonction, mon entrée selon la BDG est (string) « 0,1 », mais ma sortie est (double) 2.1220023981051542e-314.

Voici mon extrait copié directement le code:

double strToDouble(std::string const &numberString)
{
    istringstream inStream(numberString);
    double doubleValue;
    inStream >> doubleValue;
    if(!(inStream && (inStream >> std::ws).eof()))
    {
        return 0.0;  
    }

    return doubleValue;
};

J'utilise C ++ plutôt que Obj-C, car il aura probablement être compilé sur une machine nix ou Windows * éventuellement.

Je suis naturellement un programmeur PHP, mais ont quelques calculs que je dois accélérer, donc je le fais dans un langage compilé. Cela fait longtemps que l'Université traitant une langue de niveau inférieur = P. Donc, si quelqu'un a une idée, il serait grandement apprécié ...

J. Drew Sonne.

code complet:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

/*
 * @var delimiters the string to define a break by
 * @var str the string to break
 * @var tokens where to store the broken string parts.
 */
void explode(const string& delimiters, const string& str, vector<string>& tokens)
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // Found a token, add it to the vector.
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
};

/*
 * @var numberString double to be converted as a string.
 */
double strToDouble(std::string const &numberString)
{
    istringstream inStream(numberString);
    double doubleValue;
    inStream >> doubleValue;
    if(!(inStream && (inStream >> std::ws).eof()))
    {
        return 0.0;  
    }

    return doubleValue;
};

class Cluster {
private:
    vector<double> latStore;
    vector<double> lngStore;
public:
    Cluster(int,string,string);
};

/*
 * @var latString a comma seperated list of doubles for the latitudes.
 * @var lngString a comma separated list of doubles for the longitudes.
 */
Cluster::Cluster(int newLocationLength, string latString, string lngString)
{
    // mark our vectors
    vector<string> latStoreString;
    vector<string> lngStoreString;

    // Explode our input strings.
    explode(",", latString, latStoreString);
    explode(",", lngString, lngStoreString);

    for( int i = 0; i < latStoreString.size(); i++)
    {
        // Grab the latitude and store it.
        string tempLat = latStoreString[i];
        double latDouble = strToDouble(tempLat);
        latStore.push_back( strToDouble(tempLat) );

        // Grab the longitude and store it.
        string tempLng = lngStoreString[i];
        lngStore.push_back( strToDouble(tempLng) );
    }
}

int main (int argc, char * const argv[]) {

    Cluster *rect = new Cluster("0.1,0.4","0.1,0.4");

    return 0;
}
Était-ce utile?

La solution

Cela peut être causé par STL mode de débogage. Retirez les macros _GLIBCXX_DEBUG dans le cadre de la construction de macros préprocesseur votre cible.

C ++ Debug cassé dans Snow Leopard X-code

Autres conseils

Pourquoi ne pas utiliser à la place atof ()? lien

Je ne vois rien de mal avec votre fragment de code. Pouvez-vous montrer le code que vous utilisez sortie le résultat

Myles a suggéré, atof () pourrait être plus simple. Vous pouvez convertir un objet de chaîne à une chaîne de c en appelant la fonction membre c_str ():

double result = atof(inputString.c_str()); // 0.0 if a double couldn't be read

Voici quelques informations supplémentaires: http://www.cplusplus.com/reference / clibrary / cstdlib / atof /

#include <iostream>
#include <sstream>

double strToDouble(std::string const &numberString)
{
    std::istringstream inStream(numberString);
    double doubleValue;
    std::cout << doubleValue << '\n';
    inStream >> doubleValue;
    if(!(inStream && (inStream >> std::ws).eof()))
    {
        return 0.0;  
    }

    return doubleValue;
};

int main()
{
    std::cout << strToDouble("0.1") << '\n';

    return 0;
}

Le code ci-dessus me donne la sortie suivante:
    -2.36907e-39
    0,1

Êtes-vous par hasard vérifier la valeur de doubleValue avant de revenir?


Cluster::Cluster(string latString, string lngString)
{
    // mark our vectors
    vector<string> latStoreString;
    vector<string> lngStoreString;

    // Explode our input strings.
    explode(",", latString, latStoreString);
    explode(",", lngString, lngStoreString);

    for( int i = 0; i < latStoreString.size(); i++)
    {
        // Grab the latitude and store it.
        string tempLat = latStoreString[i];
        std::cout << "tempLat=" << tempLat << '\n';
        double latDouble = strToDouble(tempLat);
        std::cout << "latDouble=" << latDouble << '\n';
        latStore.push_back( strToDouble(tempLat) );

        // Grab the longitude and store it.
        string tempLng = lngStoreString[i];
        lngStore.push_back( strToDouble(tempLng) );
    }
}

int main (int argc, char * const argv[]) {

    Cluster *rect = new Cluster("0.1,0.4","0.1,0.4");

    return 0;
}

Sortie:
    Templat = 0,1
    latDouble = 0,1
    tEmPLat = 0,4
    latDouble = 0,4

Pouvez-vous exécuter le code avec ces modifications (vous n'utilisez pas le paramètre int dans le cteur, donc je viens enlevé). J'ai aussi couru votre code à l'aide valgrind sans erreurs (uniquement les fuites de mémoire).

On dirait que vous n'avez pas de réponse à votre question implemetion. D'autres ont suggéré d'utiliser atof (). Si vous voulez résoudre le problème dans votre implemention, alors ne regardez le code ci-dessous. Au lieu d'avoir vecteur d'exploser méthode, mettre vecteur pour éviter le code redondant. J'ai changé le code dans strToDouble ainsi.

void explode(const string& delimiters, const string& str, vector<double>& tokens)
{    
     // Skip delimiters at beginning.   
     string::size_type lastPos = str.find_first_not_of(delimiters, 0);   
     // Find first "non-delimiter".    
     string::size_type pos = str.find_first_of(delimiters, lastPos);
     while (string::npos != pos || string::npos != lastPos)   
     {        
              // Found a token, add it to the vector.       
             string temp = str.substr(lastPos, pos - lastPos);
             tokens.push_back(strToDouble(temp));    
             // Skip delimiters.  Note the "not_of"        
            lastPos = str.find_first_not_of(delimiters, pos);        
            // Find next "non-delimiter"        
            pos = str.find_first_of(delimiters, lastPos);    
     }
}

double strToDouble(std::string const &numberString)
{  
   istringstream inStream(numberString);    
   int pos = numberString.find_first_not_of("1234567890.", 0);

   if (string::npos != pos)
   {
       return 0.0;
   }
   else
   {
      double doubleValue;   
      inStream >> doubleValue;        
      return doubleValue;
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top