• 0
المـقـدام

دالة لتحويل double إلى money string

سؤال

السلام عليكم ورحمة الله وبركاته 

 

قبل أسبوع حوالي سألت سؤال حول كيفية تحويل double إلى money string في موضوع اختفى عن نظري للمبتدئين

 

وكانت الإجابة بوضع رابط  http://stackoverflow.com/questions/7276826/c-format-number-with-commas

 

في الحقيقة لم أفهم كل شيء لذلك كتبت كود بسيييييط على حسب فهمي 

 

واتمنى أرى اقتراحاتكم في تحسينه!!!

#include<iostream>#include<string>using std::string;using std::to_string;string Idtoms(long double);int main(){	long double num=1234567891234567.123466;		std::cout<<Idtoms(num)<<std::endl;	system("pause");	return 0;}string Idtoms(long double rr){	string  str1=to_string(rr);		int n=1;	int size_str1=str1.size()-1;	int j;	string str2("$000,000,000,000,000,000,000,000,000");	int size_str2=str2.size()-1;	while(size_str1-->=0)	{		if((size_str1+1)<str1.find('.'))			if(n++%4==0)			{				str2[size_str2--]=',';				n=2;			}			str2[size_str2--]=str1[size_str1+1];	}			str2.erase(1,str2.find_first_of("123456789.")-1);	return str2;}

قال عمر بن الخطاب:

رحم الله امرئ اهدى إلي عيوبي

تم تعديل بواسطه المـقـدام
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 0

السلام عليكم

عندي بعض الملاحظات والأسئلة ..

1- استخدمت std::to_string (لم تعمل عندي) ولا أدري في أي مكتبة موجودة ؟ (استعضت عنها بكتابة تابع يقوم بنفس الوظيفة (حسب ما أظن) ولكنه استغرق بعض الوقت )

2- استخدمت الدالة system دون تضمين المكتبة  cstdlib (ما البيئة التي تعمل عليها )

3- لماذا تستخدم long double هل تريد الحصول على تخزين رقم كبير ؟ استعمل long long int  ( كما أن المال لا يحتوي فواصل طويلة ربما رقمين أو ثلاثة بعد الفاصلة )
الكود الخاص بالدالة to_string

template<typename ld>string to_string(ld rr){//rr should be less than MAX_ULL    string res,result;    typedef unsigned long long int ulli;    ulli x=ulli(rr);    cout<<"the double precision number is "<<rr<<endl;    cout<<"integer part "<<x<<endl;    rr-=ld(x);//now rr contains the fractional part only    if(x==0)        res.append("0");    else        while(x>0){            res.push_back(char(x%10+'0'));            x/=10;        }    while(res.size()){        result.append(res.substr(res.size()-1));        res.erase(res.size()-1);    }    cout<<"result : "<<result<<endl;    result.append(".");    for(int i=0;i<10;i++)//10 numebers after the point        {            result.push_back(char(int(rr*10)+'0'));            rr-=int(rr*10);        }    cout<<"result : "<<result<<endl;    return result;}

 

وهذا حلي للمسألة (ببعض التعديلات على الدالة to_string)

#include<iostream>#include<string>#include<sstream>#include<cstdlib>using namespace std;template<typename ld>string to_string(ld rr){//rr should be less than MAX_ULL    string res,result;    typedef unsigned long long int ulli;    ulli x=ulli(rr);    //cout<<"the double precision number is "<<rr<<endl;    //cout<<"integer part "<<x<<endl;    rr-=ld(x);//now rr contains the fractional part only    if(x==0)        res.append("0");    else        for(int i=0;x>0;i++){            if(i%3==0&&i!=0)                res.push_back('\'');            res.push_back(char(x%10+'0'));            x/=10;        }    while(res.size()){        result.append(res.substr(res.size()-1));        res.erase(res.size()-1);    }    //cout<<"result : "<<result<<endl;    result.append(".");    for(int i=0;i<10;i++)//10 numebers after the point        {            result.push_back(char(int(rr*10)+'0'));            rr-=int(rr*10);        } //   cout<<"result : "<<result<<endl;    return result;}int main(){    long double num=1234567891234567.123466;    std::cout<<to_string(num)<<std::endl;    system("pause");    return 0;} 

 

وعذراً للتأخر في الرد

 

والله ولي التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
1- استخدمت std::to_string (لم تعمل عندي) ولا أدري في أي مكتبة موجودة ؟ (استعضت عنها بكتابة تابع يقوم بنفس الوظيفة (حسب ما أظن) ولكنه استغرق بعض الوقت )

هى أحد الإضافات الجديدة للإصدار C++11.

 

 

و الله ولي التوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .