আমি রূপান্তর করার চেষ্টা করছি std::stringকরার float/double। আমি চেষ্টা করেছিলাম:
std::string num = "0.6";
double temp = (double)atof(num.c_str());
তবে এটি সর্বদা শূন্য ফিরে আসে। অন্য কোন উপায়ে?
আমি রূপান্তর করার চেষ্টা করছি std::stringকরার float/double। আমি চেষ্টা করেছিলাম:
std::string num = "0.6";
double temp = (double)atof(num.c_str());
তবে এটি সর্বদা শূন্য ফিরে আসে। অন্য কোন উপায়ে?
উত্তর:
std::string num = "0.6";
double temp = ::atof(num.c_str());
এটি আমার জন্য, এটি একটি বৈধ সি ++ সিনট্যাক্সটি একটি স্ট্রিংকে ডাবলে রূপান্তর করা।
আপনি এটি স্ট্রিংস্ট্রিম বা বুস্ট :: লেক্সিক্যাল_কাস্ট দিয়ে করতে পারেন তবে এগুলি পারফরম্যান্স পেনাল্টি নিয়ে আসে।
আহা তোমার কিউটি প্রকল্প আছে ...
QString winOpacity("0.6");
double temp = winOpacity.toDouble();
অতিরিক্ত নোট:
ইনপুট ডেটা একটি হয়, তাহলে const char*, QByteArray::toDoubleদ্রুততর হবে।
স্ট্যান্ডার্ড লাইব্রেরি (সি ++ 11) এর সাথে পছন্দসই কার্যকারিতা সরবরাহ করে std::stod:
std::string s = "0.6"
std::wstring ws = "0.7"
double d = std::stod(s);
double dw = std::stod(ws);
সাধারণত অন্যান্য অন্যান্য মৌলিক ধরণের জন্য, দেখুন <string>। সি স্ট্রিংগুলির জন্য কিছু নতুন বৈশিষ্ট্যও রয়েছে। দেখা<stdlib.h>
ostringstreamনিজেই টাইপ করতে খুব দীর্ঘ ছিল, একা ব্যবহার করা যাক ..
লেক্সিকাল castালাই খুব সুন্দর।
#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;
}
try { ... boost::lexical_cast ... } catch (std::exception const& err) { //handle excpetion }
catch ( boost::bad_lexical_cast const& err )হওয়ার জন্য, ব্যতিক্রমটি ধরতে ব্যবহার করুন ।
আপনি স্ট্যান্ড স্ট্রিমস্ট্রিম ব্যবহার করতে পারেন:
#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;
}
ব্যবহার:
double number= StringToNumber<double>("0.6");
হ্যাঁ, একটি লেজিকাল কাস্ট সহ। স্ট্রিংস্ট্রিম এবং << অপারেটর ব্যবহার করুন বা বুস্ট ব্যবহার করুন, তারা ইতিমধ্যে এটি প্রয়োগ করেছে।
আপনার নিজস্ব সংস্করণ দেখতে পারে:
template<typename to, typename from>to lexical_cast(from const &x) {
std::stringstream os;
to ret;
os << x;
os >> ret;
return ret;
}
আপনি বুস্ট লেক্সিকাল কাস্ট ব্যবহার করতে পারেন:
#include <boost/lexical_cast.hpp>
string v("0.6");
double dd = boost::lexical_cast<double>(v);
cout << dd << endl;
দ্রষ্টব্য: বুস্ট :: লেক্সিক্যাল_কাস্ট ব্যতিক্রম ছুঁড়েছে তাই আপনি যখন অবৈধ মান পাস করেন তখন এটি মোকাবেলা করার জন্য আপনাকে প্রস্তুত হওয়া উচিত, স্ট্রিং ("xxx") পাশ করার চেষ্টা করুন
আপনি যদি সমস্ত বৃদ্ধিতে টানতে না চান তবে এর সাথে strtod(3)যান <cstdlib>- এটি ইতিমধ্যে একটি দ্বিগুণ দেয়।
#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;
}
ফলাফল:
$ g++ -o s s.cc
$ ./s
0.6 0.6
$
কেন atof () কাজ করে না ... আপনি কোন প্ল্যাটফর্ম / সংকলক চালু আছেন?
এই উত্তরটি আপনার মন্তব্যে লিটবকে ব্যাক আপ করছে। আপনি কেবল ফলাফলটি সঠিকভাবে প্রদর্শন করছেন না এমন আমার গভীর সন্দেহ রয়েছে।
আমার সাথে ঠিক একই ঘটনা ঘটেছিল। আমি কেন একটি 64৪-বিট ইন্টিতে খারাপ মান পাচ্ছি তা আবিষ্কার করার জন্য আমি একটি পুরো দিন ব্যয় করেছি, কেবল এটি আবিষ্কার করতে যে প্রিন্টফ দ্বিতীয় বাইটটিকে উপেক্ষা করছে। আপনি প্রিন্টফের মতো এটির মতো কোনও 64-বিট মানটি পাস করতে পারবেন না।
atof()আসল প্রশ্নে কেন কাজ করছেন না: এটিকে দ্বিগুণ করে দেওয়ার বিষয়টি আমাকে সন্দেহজনক করে তুলেছে। কোডটি ছাড়াই সংকলন করা উচিত নয় #include <stdlib.h>, তবে যদি একটি সংকলন সতর্কতা সমাধান করতে কাস্ট যুক্ত করা হয় তবে atof()সঠিকভাবে ঘোষণা করা হয় না। যদি atof()সংকলকটি কোনও int প্রদান করে, umesালাই এটি রূপান্তরকরণের সতর্কবার্তাটি সমাধান করবে, তবে এটি ফেরতের মানটিকে দ্বিগুণ হিসাবে স্বীকৃতি দেবে না ।
#include <stdlib.h>
#include <string>
...
std::string num = "0.6";
double temp = atof(num.c_str());
সতর্কতা ছাড়াই কাজ করা উচিত।
বুস্টকে সমীকরণে টেনে আনার পরিবর্তে আপনি আপনার স্ট্রিংটিকে (অস্থায়ীভাবে) char[]ব্যবহার এবং ব্যবহার হিসাবে রাখতে পারেন sprintf()।
তবে অবশ্যই আপনি যেভাবেই বুস্ট ব্যবহার করছেন, এটি আসলে খুব বেশি সমস্যা নয়।
আপনি স্ট্রিংয়ের জন্য বুস্ট লেজিক্যাল_কাস্ট চান না <-> যাইহোক ফ্লোটিং পয়েন্ট। ব্যবহারের ক্ষেত্রে এই উপসেটটি একমাত্র সেট যার জন্য ধারাবাহিকভাবে বুস্ট করা পুরানো ফাংশনগুলির চেয়ে খারাপ-এবং তারা মূলত সেখানে তাদের সমস্ত ব্যর্থতা কেন্দ্রীভূত করেছিল, কারণ তাদের নিজস্ব কার্যকারিতার ফলাফলগুলি এই জাতীয় রূপান্তরগুলির জন্য স্ক্যানফ এবং প্রিন্টফ ব্যবহার করার চেয়ে 20-25X স্লুওয়ার পারফরম্যান্স দেখায়।
গুগল এটি নিজে। বুস্ট :: লেক্সিক্যাল_কাস্ট 50 টি রূপান্তর এর মতো কিছু পরিচালনা করতে পারে এবং যদি আপনি ভাসমান পয়েন্টের সাথে যুক্তগুলি বাদ দেন তবে এটি সুস্পষ্ট বিকল্পগুলির মতো ভাল বা আরও ভাল (সেই সমস্ত ক্রিয়াকলাপের জন্য একটি একক এপিআই থাকার অতিরিক্ত সুবিধা সহ)। পারফরম্যান্সের দিক থেকে টাইটানিকের মতো আইসবার্গে আঘাত করা ভাসমান এবং এটি নিয়ে আসা।
পুরানো, ডেডিকেটেড স্ট্র-> ডাবল ফাংশনগুলি 30 এমএস (বা আরও ভাল) এর মতো 10000 পার্স করতে পারে। লেক্সিক্যাল_কাস্ট একই কাজ করতে 650 এমএসের মতো কিছু লাগে।
আমার সমস্যা:
আমার সমাধান (উইন্ডোজ ফাংশন _wcstod_l ব্যবহার করে):
// string to convert. Note: decimal seperator is ',' here
std::wstring str = L"1,101";
// Use this for error detection
wchar_t* stopString;
// Create a locale for "C". Thus a '.' is expected as decimal separator
double dbl = _wcstod_l(str.c_str(), &stopString, _create_locale(LC_ALL, "C"));
if (wcslen(stopString) != 0)
{
// ... error handling ... we'll run into this because of the separator
}
এইচটিএইচ ... আমাকে এই সমাধানটি পেতে বেশ দীর্ঘ সময় নিয়েছে। এবং আমার এখনও অনুভূতি রয়েছে যে স্ট্রিং স্থানীয়করণ এবং স্টাফ সম্পর্কে আমি যথেষ্ট পরিমাণে জানি না ...