117 votes

std :: string pour flotter ou doubler

J'essaie de convertir std::string en float/double . J'ai essayé:

 std::string num = "0.6";
double temp = (double)atof(num.c_str());
 

Mais il retourne toujours zéro. De toute autre manière?

141voto

TimW Points 5715
 std::string num = "0.6";
double temp = ::atof(num.c_str());
 

Le fait pour moi, c’est une syntaxe C ++ valide pour convertir une chaîne en double.

Vous pouvez le faire avec stringstream ou boost :: lexical_cast, mais ceux-ci viennent avec une pénalité de performance.


Ahaha vous avez un projet Qt ...

 QString winOpacity("0.6");
double temp = winOpacity.toDouble();
 

Note supplémentaire:
Si les données d'entrée sont un const char* , QByteArray::toDouble sera plus rapide.

129voto

ManuelSchneid3r Points 1507

La Bibliothèque Standard C++(C ++ 11) offre les fonctionnalités souhaitées avec std::stod :

std::string  s  = "0.6"
std::wstring ws = "0.7"
double d  = std::stod(s);
double dw = std::stod(ws);

Je suppose que la Bibliothèque Standard convertit en interne, mais ça rend le code plus propre. Généralement pour la plupart des autres types de base, reportez - <string>. Il y a quelques nouvelles fonctionnalités pour les chaînes C, trop. Voir <stdlib.h>

30voto

sharth Points 25625

Le casting lexical est très gentil.

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

using std::endl;
using std::cout;
using std::string;
using boost::lexical_cast;

int main() {
    string str = "0.6";
    double dub = lexical_cast<double>(str);
    cout << dub << endl;
}
 

14voto

Vous pouvez utiliser std :: stringstream:

    #include <sstream>
   #include <string>
   template<typename T>
   T StringToNumber(const std::string& numberAsString)
   {
      T valor;

      std::stringstream stream(numberAsString);
      stream >> valor;
      if (stream.fail()) {
         std::runtime_error e(numberAsString);
         throw e;
      }
      return valor;
   }
 

Usage:

 double number= StringToNumber<double>("0.6");
 

11voto

DaClown Points 1520

Oui, avec une distribution lexicale. Utilisez un stringstream et l'opérateur <<, ou utilisez Boost, ils l'ont déjà implémenté.

Votre propre version pourrait ressembler à:

 template<typename to, typename from>to lexical_cast(from const &x) {
  std::stringstream os;
  to ret;

  os << x;
  os >> ret;

  return ret;  
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X