আমি কীভাবে ডাবলকে সি ++ এ স্ট্রিংয়ে রূপান্তর করব?


171

আমার স্ট্রিং হিসাবে একটি ডাবল সংরক্ষণ করা উচিত। আমি জানি যে আমি printfএটি প্রদর্শন করতে চাইলে আমি এটি ব্যবহার করতে পারি তবে আমি কেবল এটি একটি স্ট্রিং ভেরিয়েবলে সংরক্ষণ করতে চাই যাতে এটি পরে মানচিত্রে সংরক্ষণ করতে পারি ( মান হিসাবে , কী হিসাবে নয় )।


2
আপনার প্রশ্নের উত্তর দেওয়ার জন্য একটি প্রশ্ন: আপনি কেন মানচিত্রে স্ট্রিংয়ের জন্য দ্বিগুণ মান স্ট্রিং করছেন? আপনি কি কী হিসাবে স্ট্রিং-আইয়েড ডাবল ব্যবহার করতে যাচ্ছেন? যদি তা না হয় তবে কেন দ্বিগুণ রেখে যাবেন?
ম্যাট ম্যাকক্লেলান 21

1
আকর্ষণীয় বিষয়। মানচিত্র কী হিসাবে একটি ডাবল ব্যবহার করা বিপদ পূর্ণ হতে পারে, তবে ভাসমান পয়েন্টের মানগুলির ক্ষেত্রে যথাযথ তুলনা সর্বদা হয়। স্ট্রিং উপস্থাপনের সূচীকরণ সমস্যাটি এড়ায়।
ফ্রেড লারসন 21

2
কেন একে একে রূপান্তর? এটিকে মানচিত্রে দ্বিগুণ হিসাবে সঞ্চয় করুন এবং এর থেকে এবং এ থেকে রূপান্তর এড়ানো।
এভিলটিচ

3
এটি এখনও অবজেক্টগুলির জন্য কল হিসাবে শোনাচ্ছে। একটি ইউনিয়ন কাজ করবে। প্রতিটি বস্তু এতে বিভিন্ন মান সন্নিবেশ করান এবং এটি স্ব স্বীকৃত হয়।
এভিলটিচ

2
আমার কাছে একটি ফাইলে কেবল নাম / মান জোড়া রয়েছে। এটি বস্তুর জন্য কল করে না।
বিল করুন

উত্তর:


183

বুস্ট (TM) উপায়:

std::string str = boost::lexical_cast<std::string>(dbl);

স্ট্যান্ডার্ড সি ++ উপায়:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

দ্রষ্টব্য : ভুলে যাবেন না#include <sstream>


3
আমি মনে করি বুস্ট :: লেক্সিক্যাল_কাস্টটি হ'ল স্ট্যান্ডার্ড সি ++ উপায়, আপনার জন্য খুব সুন্দরভাবে প্যাকেজ করা। বিটিডাব্লু, লিটব, আপনার সেখানে একটি ছোটখাটো টাইপ রয়েছে - "বুট: লেজিকাল_কাস্ট"।
ফ্রেড লারসন

2
বুস্ট :: লেক্সিক্যাল_কাস্ট স্ট্রিংস্ট্রোড কোডের চারপাশে কেবল একটি সাধারণ মোড়ক নয়। রূপান্তর রুটিনগুলির অনেকগুলি ইনলাইন প্রয়োগ করা হয়। এই পৃষ্ঠার নীচে কর্মক্ষমতা পরিমাপ অনুসারে ( boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm ) বুস্ট :: লেক্সিক্যালকাস্ট স্ট্রিংস্ট্রিমগুলি ব্যবহার করার চেয়ে দ্রুত এবং বেশিরভাগ ক্ষেত্রে স্ক্যানফ / প্রিন্টফ
ফেরুকসিও

1
@ ফেরার কে বলেছিলেন যে এটি একটি সাধারণ মোড়ক? আর ধন্যবাদ লিঙ্ক দেওয়ার জন্য, আমি আসলে হয়নি মনে হয় এটা ছিল বেশী বা একটি সহজ মোড়কের :) কম
litb - জোহানেস Schaub

27
#include <sstream>সি ++
উপায়ের

3
ডকুমেন্টেশনের খাতিরে, আপনি না নিলে আপনি #include <sstream>একটি ত্রুটি পাবেন "অসম্পূর্ণ প্রকারের অনুমতি নেই"।
ট্রেভর সুলিভান

194
// The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);

// The C++03 way:
std::ostringstream sstream;
sstream << myDoubleVar;
std::string varAsString = sstream.str();

// The C++11 way:
std::string varAsString = std::to_string(myDoubleVar);

// The boost way:
std::string varAsString = boost::lexical_cast<std::string>(myDoubleVar);

1
আপনার সি ++ টি উপায় কাজ করবে না কারণ operator <<একটি std::ostream&পরিবর্তে ফিরে আসে stringstream&
কনরাড রুডল্ফ

আমার স্ট্রিং স্ট্রিমগুলি কিছুটা মরিচা বলে মনে হচ্ছে, আমি 'সি'র উপায় পছন্দ করি। এখনই স্থির (আশা করি)।
অ্যাডাম রোজেনফিল্ড

আপনার সি কোড আমাকে প্রথমে ফেলে দিয়েছে। সঠিক বিকল্প দেওয়ার জন্য আমি আপনাকে উত্সাহিত করেছি।
বিল করুন

2
সি উপায় অন্তর্ভুক্ত জন্য upvote। আমার কাছে অনেক পরিষ্কার মনে হচ্ছে।
নিলন

11
সি ++ 11 উপায়ে উন্নীত হয়েছে। আমি সি ++ এ নতুন, এবং বুঝতে পারিনি যে এখানে কোনও to_stringফাংশন রয়েছে। আমি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ 2013 ব্যবহার করছি
ট্রেভর সুলিভান

123

স্ট্যান্ডার্ড সি ++ 11 উপায় (আপনি আউটপুট ফরম্যাট যত্ন সম্পর্কে না থাকেন):

#include <string>

auto str = std::to_string(42.5); 

to_stringN1803 (r0), N1982 (r1) এবং N2408 (r2) " সিম্পল নিউমেরিক অ্যাক্সেস " এ চালু করা একটি নতুন লাইব্রেরি ফাংশন । এছাড়াও আছেstod ফাংশন বিপরীত অপারেশন সম্পাদন করতে।

আপনি যদি এর চেয়ে আলাদা আউটপুট ফর্ম্যাট "%f"করতে চান তবে অন্যান্য উত্তরে বর্ণিত পদ্ধতি snprintfবা ostringstreamপদ্ধতিগুলি ব্যবহার করুন ।


3
ক্সদবত. to_string এবং 11. ভিসুয়াল স্টুডিও উভয় কাজ Stod
BSalita

ওহে প্রিয় বাচ্চা ... টু স্ট্রিং ভিজ্যুয়ালস্টুডিও 2010 তে কাজ করার জন্য উপস্থিত হবে না): এটি, বা আমি জানি না আমি কী করছি (খুব সম্ভব)
শেফফনার্ড

1
এটি আরও বেশি হওয়া উচিত, যেহেতু এটি আরও আধুনিক!
gsamaras

1
এই ফাংশনটি প্রয়োজনের চেয়ে বেশি দশমিক যোগ না করার কোনও উপায় আছে কি? আমি যখন ডাবলকে রূপান্তর করি তখন 8.0এটি আমাকে স্ট্রিং দেয় "8.000000", যখন "8"পুরোপুরি ঠিক থাকে।
হ্যালো গুডবাই

1
এই ছোট সংখ্যার জন্য না কাজ ... যেমন করে: 1e-9উত্পাদন করে0.000000
user3728501

24

আপনি যদি সি ++ ব্যবহার করেন তবে এড়িয়ে চলুন sprintf। এটি আন-সি ++ y এবং বেশ কয়েকটি সমস্যা রয়েছে। স্ট্রিং স্ট্রিমগুলি পছন্দের পদ্ধতি, পছন্দ হিসাবে বুস্ট.লেক্সিকাল কাস্টের মতো এনক্যাপসুলেটেড যা বেশ সহজেই করা যায়:

template <typename T>
std::string to_string(T const& value) {
    stringstream sstr;
    sstr << value;
    return sstr.str();
}

ব্যবহার:

string s = to_string(42.5);

24

আপনি সি ++ 11 তে স্ট্যান্ড :: টু স্ট্রিং ব্যবহার করতে পারেন

double d = 3.0;
std::string str = std::to_string(d);

আমার সংখ্যাগুলি সত্যিই ছোট ছিল এবং std::to_string()কেবল 0.000000 ফিরে এসেছিল এবং বৈজ্ঞানিক আকারে নয়।
এরফান

11

sprintfঠিক আছে, তবে সি ++ এ, রূপান্তরটি করার আরও ভাল, নিরাপদ এবং কিছুটা ধীরে ধীরে stringstream:

#include <sstream>
#include <string>

// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();

আপনি বুস্ট.লেক্সিকাল কাস্ট ব্যবহার করতে পারেন :

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

// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);

উভয় ক্ষেত্রে, পরে strহওয়া উচিত "453.23"। লেক্সিক্যাল কাস্টের কিছু সুবিধা রয়েছে যা এটি নিশ্চিত করে যে রূপান্তরটি সম্পূর্ণ। এটি stringstreamঅভ্যন্তরীণভাবে ব্যবহার করে ।



7

ভেষজ সুটার স্ট্রিং ফর্ম্যাটিংয়ের উপর একটি দুর্দান্ত নিবন্ধ আছে । আমি এটি পড়ার পরামর্শ দিচ্ছি। আমি এটি আগে যুক্ত করেছিলাম ।


1
এটি কোনও উত্তর নয়, তবে প্রশ্নটিতে খুব দরকারী মন্তব্য করবে।
সীমিত প্রায়শ্চিত্ত

6

লেক্সিক্যাল_কাস্টের সমস্যা হ'ল নির্ভুলতা সংজ্ঞায়িত করতে অক্ষম। সাধারণত আপনি যদি ডাবলকে স্ট্রিংয়ে রূপান্তর করেন তবে এটি এটিকে মুদ্রণ করতে চান বলেই। যথার্থতা যদি খুব বেশি বা খুব কম হয় তবে এটি আপনার আউটপুটকে প্রভাবিত করবে।



4

হেই, আমি কেবল এটি লিখেছি (এই প্রশ্নের সাথে সম্পর্কিত নয়):

string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();

/* rest of the code */

2

আপনি আমার পূর্বের পোস্টটি পড়তে চাইতে পারেন। (অস্থায়ী ostringstream বস্তু সহ ম্যাক্রোয়েড সংস্করণ।)

রেকর্ডের জন্য: আমার নিজের কোডে, আমি স্নিপ্রিন্টফের পক্ষে ()। স্থানীয় স্ট্যাকের একটি চর অ্যারে সহ, এটি এতটা অক্ষম নয়। (ঠিক আছে, যদি আপনি অ্যারের আকারটি অতিক্রম করে থাকেন এবং এটি করতে দুবার লুপ করেন তবে ...)

(আমি এটি ভার্সনপ্রিন্টফের মাধ্যমেও আবৃত করেছি) But তবে এতে আমার কোনও ধরণের চেক করতে ব্যয় হয় you আপনি কোডটি চাইলে হেল্প করুন ...)


2

কটাক্ষপাত sprintf()ও পরিবার।


2
আমি প্রিন্টফের কথা উল্লেখ করেছি কারণ গুগলিং এমন একটি নিবন্ধের গোছা তৈরি করেছে যা বলে যে আপনি ডাবল থেকে স্ট্রিংয়ে প্রিন্টফ ব্যবহার করেন convert তারা এই ধারণাটি তৈরি করে যে আপনি কেবলমাত্র মুদ্রণটিই করতে পারেন যা আমার ক্ষেত্রে মিথ্যা।
বিল করুন

কেন আপনি ভোট -1? আমার মনে হয় স্প্রিন্টফ বেশ ভাল। @ বিল্টলিজার্ড, স্প্রিন্ট স্ক্রিনের পরিবর্তে একটি চরকে কিছু মুদ্রণ করে। কেউ জবাব দিয়েছে সি পদ্ধতিতে এখনও প্রচুর ভোট পেয়েছে।
ওয়ার্ল্ডমিটারেটর

2

সাধারণত এই অপারেশনগুলির জন্য আপনাকে একভিটি, এফসিভিটি বা জিসিভিটি ফাংশন ব্যবহার করতে হবে:

/* gcvt example */
#include <stdio.h>
#include <stdlib.h>

main ()
{
  char buffer [20];
  gcvt (1365.249,6,buffer);
  puts (buffer);
  gcvt (1365.249,3,buffer);
  puts (buffer);
  return 0;
}

Output:
1365.25
1.37e+003   

একটি ফাংশন হিসাবে:

void double_to_char(double f,char * buffer){
  gcvt(f,10,buffer);
}


0

ব্যবহার to_string()
উদাহরণ:

#include <iostream>   
#include <string>  

using namespace std;
int main ()
{
    string pi = "pi is " + to_string(3.1415926);
    cout<< "pi = "<< pi << endl;

  return 0;
}

এটি নিজেই চালান: http://ideone.com/7ejfaU এগুলিও
উপলব্ধ:

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

0

আপনি এই ফাংশনটি ব্যবহার করে যে কোনও কিছুকে কোনও কিছুতে রূপান্তর করতে পারেন:

template<class T = std::string, class U>
T to(U a) {
    std::stringstream ss;
    T ret;
    ss << a;
    ss >> ret;
    return ret;
};

ব্যবহার:

std::string str = to(2.5);
double d = to<double>("2.5");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.