Frage std :: string zum float oder double


Ich versuche zu konvertieren std::string zu float/double. Ich habe es versucht:

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

Aber es gibt immer Null zurück. Irgendwelche anderen Möglichkeiten?


75
2018-06-18 13:15


Ursprung


Antworten:


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

Ist es für mich, ist es eine gültige C ++ - Syntax, um eine Zeichenfolge in ein Double zu konvertieren.

Sie können dies mit dem stringstream oder boost :: lexical_cast tun, aber diese werden mit einer Leistungseinbuße verbunden.


Ahaha du hast ein Qt Projekt ...

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

Zusätzliche Anmerkung:
Wenn die Eingabedaten sind a const char*, QByteArray::toDouble wird schneller sein.


103
2018-06-18 13:25



Die Standardbibliothek (C ++ 11) bietet die gewünschte Funktionalität mit std::stod :

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

Ich schätze, die Standardbibliothek konvertiert auch intern, aber auf diese Weise wird der Code sauberer. Im Allgemeinen für die meisten anderen Grundtypen, siehe <string>. Es gibt auch einige neue Funktionen für C-Saiten. Sehen <stdlib.h> 


78
2017-10-17 10:41



Lexikalische Besetzung ist sehr nett.

#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;
}

27
2018-06-18 13:21



Sie können std :: stringstream verwenden:

   #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;
   }

Verwendung:

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

14
2018-06-18 13:27



Ja, mit einer lexikalischen Besetzung. Benutze einen stringstream und den Operator << oder verwende Boost, sie haben ihn bereits implementiert.

Ihre eigene Version könnte wie folgt aussehen:

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

  os << x;
  os >> ret;

  return ret;  
}

9
2018-06-18 13:19



Sie können boost lexical cast verwenden:

#include <boost/lexical_cast.hpp>

string v("0.6");
double dd = boost::lexical_cast<double>(v);
cout << dd << endl;

Hinweis: boost :: lexical_cast löst eine Ausnahme aus, so dass Sie bereit sein sollten, damit umzugehen, wenn Sie einen ungültigen Wert übergeben, versuchen Sie, die Zeichenfolge ("xxx") zu übergeben.


7
2018-06-18 13:22



Wenn Sie nicht alle Boosts reinziehen möchten, gehen Sie mit strtod(3) von <cstdlib> - Es gibt bereits ein Doppel zurück.

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;

int main()  {
    std::string  num = "0.6";
    double temp = ::strtod(num.c_str(), 0);

    cout << num << " " << temp << endl;
    return 0;
}

Ausgänge:

$ g++ -o s s.cc
$ ./s
0.6 0.6
$

Warum atof () nicht funktioniert ... auf welcher Plattform / welchem ​​Compiler bist du?


4
2018-06-18 13:23



Ich hatte das gleiche Problem in Linux

double s2f(string str)
{
 istringstream buffer(str);
 double temp;
 buffer >> temp;
 return temp;
}

Es klappt.


3
2018-02-19 09:50



Diese Antwort sichert litb in deinen Kommentaren. Ich habe tiefgründigen Verdacht, dass Sie das Ergebnis nicht richtig anzeigen.

Mir ist genau das gleiche passiert, was mir einmal passiert ist. Ich verbrachte einen ganzen Tag damit, herauszufinden, warum ich einen schlechten Wert in einen 64-Bit-Int bekommen hatte, nur um festzustellen, dass printf das zweite Byte ignorierte. Sie können nicht einfach einen 64-Bit-Wert wie einen int an printf übergeben.


1
2018-06-18 13:38



   double myAtof ( string &num){
      double tmp;
      sscanf ( num.c_str(), "%lf" , &tmp);
      return tmp;
   }

1
2018-06-18 14:18