Pertanyaan std :: string untuk mengapung atau ganda


Saya mencoba untuk berkonversi std::string untuk float/double. Saya mencoba:

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

Tapi itu selalu mengembalikan nol. Ada cara lain?


75
2018-06-18 13:15


asal


Jawaban:


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

Apakah itu untuk saya, itu adalah sintaks C ++ yang valid untuk mengubah string menjadi ganda.

Anda dapat melakukannya dengan stringstream atau boost :: lexical_cast tetapi mereka datang dengan penalti kinerja.


Ahaha Anda punya proyek Qt ...

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

Catatan tambahan:
Jika data input adalah a const char*, QByteArray::toDouble akan lebih cepat.


103
2018-06-18 13:25



Perpustakaan Standar (C ++ 11) menawarkan fungsionalitas yang diinginkan dengan std::stod :

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

Saya kira Perpustakaan Standar juga mengkonversi secara internal, tetapi cara ini membuat kode lebih bersih. Umumnya untuk sebagian besar tipe dasar lainnya, lihat <string>. Ada beberapa fitur baru untuk string C juga. Lihat <stdlib.h> 


78
2017-10-17 10:41



Lexical cast sangat bagus.

#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



Anda dapat menggunakan 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;
   }

Pemakaian:

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

14
2018-06-18 13:27



Ya, dengan pemain leksikal. Gunakan stringstream dan << operator, atau gunakan Boost, mereka sudah menerapkannya.

Versi Anda sendiri dapat terlihat seperti:

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



Anda dapat menggunakan meningkatkan leksikal pemain:

#include <boost/lexical_cast.hpp>

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

Catatan: boost :: lexical_cast melempar pengecualian sehingga Anda harus siap menghadapinya ketika Anda memberikan nilai yang tidak valid, coba lewati string ("xxx")


7
2018-06-18 13:22



Jika Anda tidak ingin menyeret semua dorongan, pergilah strtod(3) dari <cstdlib> - sudah mengembalikan dua kali lipat.

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

Hasil:

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

Mengapa atof () tidak berfungsi ... platform / kompiler apa yang Anda gunakan?


4
2018-06-18 13:23



Saya memiliki masalah yang sama di Linux

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

berhasil.


3
2018-02-19 09:50



Jawaban ini mendukung litb dalam komentar Anda. Saya memiliki kecurigaan yang mendalam bahwa Anda tidak menampilkan hasilnya dengan benar.

Saya memiliki hal yang sama persis terjadi pada saya sekali. Saya menghabiskan satu hari penuh untuk mencari tahu mengapa saya mendapatkan nilai yang buruk ke int 64 bit, hanya untuk menemukan bahwa printf mengabaikan byte kedua. Anda tidak bisa melewatkan nilai 64-bit ke dalam printf seperti int.


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