الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه المـقـدام في 8 مارس 2014 · 2 رد · 1,221 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

قبل أسبوع حوالي سألت سؤال حول كيفية تحويل 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;
}

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

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

تم تعديل هذه المشاركة بواسطة المـقـدام في 8 مارس 2014 في 14:52

1

 إن المعلم والطبيب كلاهمــــا ... لا ينصحـان إذا همـا لم يكرمـا 


فاصبر لدائـك إن أهنت طبيبه ... واصبــر لجهلك إن جفوت معلما

#2

السلام عليكم

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

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

 

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

 

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

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

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

 

 

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

1

مدونتي: C++ Tips and Tricks

مواضيع مشابهة