Faisal Matari بتاريخ: 26 نوفمبر 2016 تقديم بلاغ مشاركة بتاريخ: 26 نوفمبر 2016 السلام عليكم ورحمة الله وبركاته اطلب الأذن من زميلي محمد المارعي وذاك لاستخدامي الكود الذي قام بارساله لي في (رسالة خاصة) كي أقوم بتحليله وقد قمت بنشره في هذا الموضوع بشكل (عام) لتعم الفائدة على جميع منسوبي وزوار وطالبي العلم من هذا المنتدى والصرح العملاق. فهذه الدالة يمكننا استخدامها لتحويل المبالغ المالية من رقمية الى نصية مثلاً من 200.50 نحولها الى مائتان ريال وخمسون فلسا وقد نستخدمها في مجالات أخرى ليس لتحويل المبالغ فقط ، بل قد نستخدمها لتحويل أي ارقام أخرى فمثلاً نستخدمها لحساب أصناف فنقول لدينا 50 كرتون و20 جزء أو مثلاً لحساب كميات فنقول 80 علبة و6 حبات فهذه الدالة بشكل عام هي لتحويل الأرقام الى نصوص وفقاً (لوحدات) و (أجزاء) من الوحدات بالشكل التالي (مثلاً نريد تحليل الرقم 206.50) الى مائتان وستة ريال يمني وخمسون فلس أولاً تحليل الدالة Num_ar = اسم الدالة P_inp_num = الرقم الذي تريد تحويله الى حروف (206) v_ce = نوع العملة (ريال يمني ، ريال سعودي ، جنيه مصري) (ريال يمني) ويمكن استخدام وحدات (متر ، كجح,...الخ) v_de = نوع الفكه (قرش ، فلس ، هلله) الفكه هي جزء من العملة ، (فلس) ويمكن اسيتخدام أجزاء (سم ، جرام ، ...الخ) v_det = الرقم بعد الفاصلة العشرية ، وهو رقم (الفكة) تميثل (50) v_lan = اللغة التي تريد ارجاعها (AR = عربي ، EN = انجليزي) الآن نأتي للتطبيق ، مثلاً نريد تحليل الرقم 960.30 الى تسعمائة وستون ريال يمني وثلاثن فلساً بالعربي نرسل للدالة Num_ar (960,'ريال يمني','فلس',30,'AR') ; نريد تحليل حولة سيارة تقدر بـ 650.150 الى ستمائة وخمسون طن ومائة وخمسون كيلو جرام بالإنجليزي نرسل للدالة Num_ar (650,'TAN',KGM',150,'EN') ; الكود كالتالي create or replace function Num_ar (P_inp_num in NUmber,v_ce in varchar2 DEFAULT 'ريال يمني',v_de in varchar2 DEFAULT 'قرش',v_det in number DEFAULT 0,v_lan in varchar2 DEFAULT 'AR') return Varchar2 as -- Functions called : D3_To_Word L_Return Varchar2(1000); m Number := 0; V_inp_Num Number := 0; V_inp_Int Number := 0; V_inp_dec Number := 0; V_Char Varchar2(100); V_Temp Number := 0; Type LionArray is table of Varchar2(500); In_str LionArray := LionArray ( '', ' آلف ', ' مليون ' , ' مليار ' , ' ترليون ' ,' فرليون ' , ' سرسليون ' , ' تسرسليون ' , ' فيمتون ' ); -- ENGLSH VARIBLE eL_Return Varchar2(1000); em Number := 0; eV_inp_Num Number := 0; eV_inp_Int Number := 0; eV_inp_dec Number := 0; eV_Char Varchar2(100); eV_Temp Number := 0; Type eLionArray is table of Varchar2(500); eIn_str eLionArray := eLionArray ( '', 'Thousand ' , 'Million ' , 'Billion ' , 'Trillion ' , 'Quadrillion ' , 'Quintillion ' , 'Sextillion ' , 'Septillion ' , 'Octillion ' , 'Nonillion ' , 'Decillion ' , 'Undecillion ' , 'Duodecillion '); -- Function function D3_To_Wordar (P1_number in number) return varchar2 as -- Pass only three digits -- This function return word equivalent to its number -- Accepted values are 0 to 999 L1_Return2 varchar2(500) := NULL; n1 Number := 0; i1 Number := 0; j1 Number := 0; k1 Number := 0; V1_inp_Number Number := 0; V1_temp Varchar2(50) := NULL; type OneArray is table of varchar2(50); type TenArray is table of varchar2(50); type hanArray is table of varchar2(50); OneStr OneArray := OneArray('واحد', 'إثنان ', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة', 'إحدىعشر', 'إثناعشر', 'ثلاثة عشر', 'أربعة عشر', 'خمسة عشر', 'ستة عشر', 'سبع عشر', 'ثمانية عشر', 'تسع عشر'); TenStr TenArray := TenArray('', 'عشرون', 'ثلاثون', 'أربعون' , 'خمسون', 'ستون', 'سبعون','ثمانون', 'تسعون'); hanStr hanArray := hanArray('مائة', 'مائتان', 'ثلاثمائة' , 'أربعمائة', 'خمسمائة', 'ستمائة','سبعمائة', 'ثمانمائة','تسعمائة'); BEGIN V1_inp_Number := P1_Number; if V1_inp_number > 999 then V1_inp_number := 0; end if; V1_temp := LPAD(to_char(V1_inp_number),3,0); -- Find Hundredth position n1 := to_number(substr(V1_temp,1,1)); if n1 > 0 then L1_Return2 := hanStr(n1); end if; i1 := to_number(substr(V1_temp,2,2)); j1 := to_number(substr(V1_temp,2,1)); k1 := to_number(substr(V1_temp,3,1)); if n1>0 AND (j1>0 OR k1>0) then L1_Return2 := L1_Return2 ||' و'; End if; if i1 > 0 and i1 < 20 then L1_Return2 :=L1_Return2 || OneStr(i1); END IF; if j1 >= 2 then if k1 > 0 then L1_Return2 := L1_Return2|| OneStr(k1)|| ' و'; end if; L1_Return2 := L1_Return2 || TenStr(j1); end if; if V1_inp_number=0 Then L1_Return2:='صفر'; End If; Return L1_Return2; END D3_To_Wordar; -- another function function Digits3_To_Word (P_number in number) return varchar2 as -- Pass only three digits -- This function return word equivalent to its number -- Accepted values are 0 to 999 -- L_Return2 varchar2(500) := NULL; i Number := 0; j Number := 0; k Number := 0; V_inp_Number Number := 0; V_temp Varchar2(50) := NULL; type OneArray is table of varchar2(50); type TenArray is table of varchar2(50); OneStr OneArray := OneArray('One ', 'Two ', 'Three ', 'Four ', 'Five ', 'Six ', 'Seven ', 'Eight ', 'Nine ', 'Ten ', 'Eleven ', 'Twelve ', 'Thirteen ', 'Fourteen ', 'Fifteen ', 'Sixteen ', 'Seventeen ', 'Eighteen ', 'Nineteen '); TenStr TenArray := TenArray('', 'Twenty ', 'Thirty ', 'Forty ' , 'Fifty ', 'Sixty ', 'Seventy ', 'Eighty ', 'Ninety '); BEGIN V_inp_Number := P_Number; if V_inp_number > 999 then V_inp_number := 0; end if; V_temp := LPAD(to_char(V_inp_number),3,0); -- Find Hundredth position i := to_number(substr(V_temp,1,1)); if i > 0 then L_Return2 := OneStr(i)||'Hundred '; end if; -- Find last 2 digits i := to_number(substr(V_temp,2,2)); j := to_number(substr(V_temp,2,1)); k := to_number(substr(V_temp,3,1)); if i > 0 and i < 20 then L_Return2 := L_Return2 || OneStr(i); end if; if j >= 2 then L_Return2 := L_Return2 || TenStr(j); if k > 0 then L_Return2 := L_Return2|| OneStr(k); end if; end if; Return L_Return2; END Digits3_To_Word; Begin IF v_lan ='AR' Then V_inp_Num := ABS(P_inp_Num); V_inp_Int := Trunc(V_inp_Num); V_inp_Dec := V_inp_Num - V_inp_Int; -- To abort to 100 if V_inp_Dec > 0 then V_inp_dec := V_inp_dec * 100; V_inp_Dec := to_number(substr(to_char(V_inp_Dec),1,2)); end if; V_char := to_char(V_inp_Int); for m in 1..In_Str.Count Loop Exit when V_char is NULL; V_Temp := To_Number(Substr(V_char,(Length(V_char)-2), 3)); if V_temp > 0 then L_Return := D3_To_WordAR(V_Temp) || In_str(m)||' و' || L_Return; end if; V_char := Substr(V_char,1,(Length(V_Char)-3)); End Loop; L_return :=Substr(L_return,1,(Length(L_return)-1)); IF P_inp_num>=1000 and P_inp_num<2000 Then L_return:=Substr(L_return,5,Length(L_return)); End if; IF P_inp_num>=2000 and P_inp_num<3000 Then L_return:='الفان'||Substr(L_return,11,Length(L_return)); End if; IF P_inp_num>=3000 and P_inp_num<=10000 Then L_return:=Substr(L_return,1,(INSTR(L_return,'آلف')-1)) || 'الآف' || Substr(L_return,(INSTR(L_return,'آلف')+3),Length(L_return)); End if; if v_det=1 then if V_inp_Dec > 0 then L_return := L_return ||v_ce||' و' || to_char(V_inp_Dec)||v_de; ELSE L_return := L_return ||' '||v_ce; end if; Else if V_inp_Dec > 0 then L_return := L_return ||v_ce||' و' ||D3_To_WordAR(V_inp_Dec)||' '||v_de; ELSE L_return := L_return ||' '||v_ce; end if; End if; if V_inp_Int > 0 then L_Return := L_Return; elsif V_inp_Int = 0 then L_return := '==='; end if; Return L_return; ELSE if P_inp_num < 0 then eV_inp_Num := (P_inp_Num * -1); else eV_inp_Num := P_inp_Num; end if; eV_inp_Int := Trunc(eV_inp_Num); eV_inp_Dec := eV_inp_Num - eV_inp_Int; if eV_inp_Dec > 0 then eV_inp_dec := eV_inp_dec * 100; eV_inp_Dec := to_number(substr(to_char(eV_inp_Dec),1,2)); end if; eV_char := to_char(eV_inp_Int); for em in 1..eIn_Str.Count Loop exit when eV_char is NULL; eV_Temp := To_Number(Substr(eV_char,(Length(eV_char)-2), 3)); if eV_temp > 0 then eL_Return := Digits3_To_Word(eV_Temp) || eIn_str(em) || eL_Return; end if; eV_char := Substr(V_char,1,(Length(eV_Char)-3)); End Loop; if eV_inp_Int > 0 then eL_Return := v_ce||' '||eL_Return ||' and '; elsif eV_inp_Int = 0 then eL_return := v_ce||' Zero and '; end if; -- Concatenate the word for decimal digits if v_det=1 then if eV_inp_Dec > 0 then eL_return := eL_return || Digits3_To_Word(eV_inp_Dec) ||' '||v_de; elsif eV_inp_Dec = 0 then eL_Return := eL_return ||' Zero '||v_de; End if; ELSE if eV_inp_Dec > 0 then eL_return := eL_return || to_char(eV_inp_Dec) ||' '||v_de; elsif eV_inp_Dec = 0 then eL_Return := eL_return ||' Zero '||v_de; End if; END if; Return eL_return; End IF; END Num_AR; 5 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
المبرمج الصاعد بتاريخ: 26 نوفمبر 2016 تقديم بلاغ مشاركة بتاريخ: 26 نوفمبر 2016 ماشا الله مهندس فيصل مشاركة رااائعة .. واسال الله ان يوفقك وان يبارك فيما تقول... مووووفق. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.