الانتقال إلى المحتوى

التفقيط


kzaghloul

Recommended Posts

كثيرا ما نحتاج إلى تحويل رقم إلى أحرف وخاصة في الفواتير مثلا:
15.021 دينار نريدها (خمسة عشر دينارا وواحد وعشرون فلسا) ولقد أرفقت الفورم الذي يقوم بهذه العملية وأرجو ان يستفيد الجميع منه

ConvertNo.zip

رابط هذا التعليق
شارك

اخي شكرا على هذا المجهود الرائع
والى الامام
لكن كيف يمكن استخدام هذه الطريقة في االتقارير
لانه في العادة يستخدم التفقيط في التقارير

رابط هذا التعليق
شارك

  • بعد 5 شهور...

شكراً وجزاك الله خير الجزاء
بل أن هناك شيء مهم جداً وهو أن القراءة تتجاهل 100 مليون ولا تقوم بتحويله إلى حروف .
169,540,322.9

يقرأ فقط 9,540,322.9


أرجو منكم التكرم بمعالجة الأكواد وجزاك الله خير

رابط هذا التعليق
شارك

  • بعد 1 سنة...

هذه PACKAGE تساعد في موضوع التفقيط باللغة العربية
CREATE OR REPLACE PACKAGE PERSONNEL.NO_IN IS
FUNCTION CONV_NO(N1 CHAR, KIND CHAR, N2 CHAR) RETURN CHAR;
FUNCTION GET_DINAR(N2 CHAR) RETURN CHAR;
FUNCTION GET_FILS(FR CHAR) RETURN CHAR;
FUNCTION LETTERS(M2 NUMBER) RETURN CHAR;
END;
/

وهذه تفاصيل الباكيج (البودي) وهي للأمانة من أخ عزيز له خبرة كبيرة معنا في العمل .. فلا تنسونا سويا من دعائكم
CREATE OR REPLACE PACKAGE BODY PERSONNEL.NO_IN
IS
FUNCTION CONV_NO (N1 CHAR, KIND CHAR, N2 CHAR)
RETURN CHAR
IS
TYPE LETTERS IS VARRAY (100) OF VARCHAR2 (30);

X LETTERS := LETTERS ('واحد ',
'اثنان ',
'ثلاثة ',
'اربعة ',
'خمسة ',
'ستة ',
'سبعة ',
'ثمانية ',
'تسعة ',
'عشرة ',
'أحد عشر ',
'إثنا عشر ',
'ثلاثة عشر ',
'أربعة عشر ',
'خمسة عشر ',
'ستة عشر ',
'سبعة عشر ',
'ثمانية عشر ',
'تسعة عشر '
);
T LETTERS := LETTERS ('عشرة ',
'عشرون ',
'ثلاثون ',
'أربعون ',
'خمسون ',
'ستون ',
'سبعون ',
'ثمانون ',
'تسعون '
);
H LETTERS := LETTERS ('مائة ',
'مائتان ',
'ثلاثمائة ',
'أربعمائة ',
'خمسمائة ',
'ستمائة ',
'سبعمائة ',
'ثمانمائة ',
'تسعمائة '
);
TH LETTERS := LETTERS ('ألف ',
'ألفان ',
'ثلاثة ألاف ',
'أربعة ألاف ',
'خمسة ألاف ',
'ستة ألاف ',
'سبعة ألاف ',
'ثمانية ألاف ',
'تسعة ألاف ',
'عشرة ألاف ',
'احد عشر ألفا ',
'اثنا عشر ألفا ',
'ثلاثة عشر ألفا ',
'أربعة عشر ألفا ',
'خمسة عشر ألفا ',
'ستة عشر ألفا ',
'سبعة عشر ألفا ',
'ثمانية عشر ألفا ',
'تسعة عشر ألفا '
);
M LETTERS := LETTERS ('مليون ',
'مليونان ',
'ثلاثة ملايين ',
'أربعة ملايين ',
'خمسة ملايين ',
'ستة ملايين ',
'سبعة ملايين ',
'ثمانية ملايين ',
'تسعة ملايين ',
'عشرة ملايين ',
'أحد عشر مليونا ',
'اثنا عشر مليوا ',
'ثلاثة عشر مليونا ',
'أربعة عشر مليونا ',
'خمسة عشر مليونا ',
'ستة عشر مليونا ',
'سبعة عشر مليونا ',
'ثمانية عشر مليونا ',
'تسعة عشر مليونا '
);
LETTER VARCHAR2 (500);
R1 VARCHAR2 (30);
R2 VARCHAR2 (30);
R3 VARCHAR2 (30);
L1 VARCHAR2 (200);
BEGIN
LETTER := '';
R1 := ' ';
R2 := ' ';
R3 := ' ';
L1 := '';

IF N1 = 0 THEN
L1 := '';
ELSIF N1 < 20 THEN
IF KIND = 'H' THEN
L1 := X(N1);
ELSIF KIND = 'T' THEN
IF SUBSTR(N2,7,3) > 0 THEN
L1 := TH(N1) || 'و';
ELSE
L1 := TH(N1);
END IF;
ELSIF KIND = 'M' THEN
IF SUBSTR(N2,4,6) > 0 THEN
L1 := M(N1) || 'و';
ELSE
L1 := M(N1);
END IF;
END IF;
ELSIF N1 < 1000 THEN
IF SUBSTR(N1,2,2) >= 20 THEN
IF SUBSTR(N1,3,1) > 0 THEN
R1 := X(SUBSTR(N1,3,1));
L1 := R1 || 'و';
ELSE
L1 := '';
R1 := '';
END IF;
IF SUBSTR(N1,2,1) > 0 THEN
R2 := T(SUBSTR(N1,2,1));
L1 := L1 || R2;
IF SUBSTR(N1,1,1) > 0 THEN
L1 := 'و' || L1;
END IF;
ELSE
R2 := '';
END IF;
ELSIF SUBSTR(N1,2,2) < 20 AND SUBSTR(N1,2,2) > 0 THEN
R1 := X(SUBSTR(N1,2,2));
L1 := 'و' || R1;
END IF;
IF (SUBSTR(N1,1,1)) > 0 THEN
R3 := H(SUBSTR(N1,1,1));
L1 := R3 || L1;
ELSE
R3 := '';
END IF;
IF KIND = 'T' AND SUBSTR(N1,1,2) > 0 THEN
IF SUBSTR(N2,7,3) > 0 THEN
L1 := L1 || ' الفا و ';
ELSE
L1 := L1 || ' ألف ';
END IF;
ELSIF KIND = 'M' AND SUBSTR(N1,1,2) > 0 THEN
IF SUBSTR(N2,4,6) > 0 THEN
L1 := L1 || ' مليونا و ';
ELSE
L1 := L1 || ' مليون';
END IF;
END IF;
END IF;
RETURN (L1);
END;

FUNCTION GET_DINAR (N2 CHAR)
RETURN CHAR
IS
RET_VAL VARCHAR2 (10);
BEGIN
RET_VAL := 'دينارا';

IF SUBSTR(N2,8,2) = '00'
THEN
RET_VAL := 'دنانير ';
ELSIF (SUBSTR(N2,9,1) BETWEEN 3 AND 9 AND SUBSTR(N2,8,1)='0') OR SUBSTR(N2,8,2) = '10'
THEN
RET_VAL := 'فلسا ';
END IF;

RETURN (RET_VAL);
END;

FUNCTION GET_FILS (FR CHAR)
RETURN CHAR
IS
RET_VAL VARCHAR2(10);
BEGIN
RET_VAL := 'فلس';
IF SUBSTR(FR,2,2) = '00'
THEN
RET_VAL := 'فلس';
ELSIF (SUBSTR(FR,3,1) BETWEEN 3 AND 9 AND SUBSTR(FR,2,1)='0') OR SUBSTR(FR,2,2) = '10'
THEN
RET_VAL := 'فلوس';
END IF;

RETURN (RET_VAL);
END;

FUNCTION LETTERS (M2 NUMBER)
RETURN CHAR
IS
N2 VARCHAR2(15);
FR VARCHAR2(4);
N3 VARCHAR2 (3);
N4 VARCHAR2 (3);
N5 VARCHAR2 (3);
ALL_LETTER VARCHAR2 (200);
BEGIN
N2 := M2;
IF N2 > 999999999.999 OR N2 < 0
THEN
RETURN ('*******************************************');
ELSE
FR := 0;
FR := N2 - FLOOR (N2);
FR := FR * 1000;
FR := LPAD(LTRIM(FR),3,'0');
N2 := FLOOR (N2);
N2 := LPAD(LTRIM(N2),9,'0');
ALL_LETTER := '';
N3 := SUBSTR (N2, 7, 3);
N4 := SUBSTR (N2, 4, 3);
N5 := SUBSTR (N2, 1, 3);

IF N2 > 0 THEN

ALL_LETTER :=
CONV_NO (N5, 'M', N2)
|| CONV_NO (N4, 'T', N2)
|| CONV_NO (N3, 'H', N2)
|| ' '
|| GET_DINAR (N2);
END IF;

IF FR > 0 AND N2 > 0 THEN

ALL_LETTER := ALL_LETTER || ' و' || CONV_NO (FR, 'H', FR);
ALL_LETTER := ALL_LETTER || ' ' || GET_FILS (FR);
ELSIF FR > 0 AND N2 = 0 THEN
ALL_LETTER := CONV_NO (FR, 'H', FR) || ' ' || GET_FILS (FR);
END IF;
RETURN (ALL_LETTER);
END IF;
END;
END;
/

رابط هذا التعليق
شارك

  • بعد 4 أسابيع...
  • بعد 1 شهر...

اخ kzaghloul .. شكرا .. على مجهودك ...
الكود كان فيه خطء بسيط .. وهوه عند فرائة 1000000 يقراها مليون الف ..
و هاذا هوه الكود بعد التعديل

FUNCTION FU_TAFKEET  (N   NUMBER) RETURN VARCHAR2 IS
type tafkeet_table is table of varchar2(15)
index by binary_integer;
 one	tafkeet_table;
 hund	tafkeet_table;

   n_ch	varchar2(8);
   n1		number(2);
   n2		number(2);
   n3		number(2);
   n4		number(2);
   n5		number(2);
   n6		number(3,3);
   ch 		varchar2(200);
   ch1		varchar2(20);
   ch2		varchar2(20);
   ch3		varchar2(20);
   ch4		varchar2(20);
   ch5		varchar2(20);
   ch6		varchar2(5);
   ch1_1	varchar2(14);
   ch3_3	varchar2(14);
   ch5_5	varchar2(19);
   and1	varchar2(2);
   and2	varchar2(2);
   and3	varchar2(2);
   and4	varchar2(2);
   and5	varchar2(2);
   fils	varchar2(4):= 'ÏÑåã';
   only	varchar2(3):= 'ÝÞØ';
   dinar	varchar2(7):= 'ÑíÇá';
   thousand	varchar2(5);--:= 'ÃáÝ';
   milion	varchar2(7);
 begin --      TABLE
 	one(0) := ' ';
 one(1) := 'æÇÍÏ ';
 one(2) := 'ÅËäÇä ';
 one(3) := 'ËáÇËÉ ';
 one(4) := 'ÃÑÈÚÉ ';
 one(5) := 'ÎãÓÉ ';
 one(6) := 'ÓÊÉ ';
 one(7) := 'ÓÈÚÉ ';
 one(8) := 'ËãÇäíÉ ';
 one(9) := 'ÊÓÚÉ ';
 one(10) := 'ÚÔÑÉ ';
 one(11) := 'ÃÍÏ ÚÔÑ';
 one(12) := 'ÅËäì ÚÔÑ';
 one(13) := 'ËáÇËÉ ÚÔÑ';
 one(14) := 'ÃÑÈÚÉ ÚÔÑ';
 one(15) := 'ÎãÓÉ ÚÔÑ';
 one(16) := 'ÓÊÉ ÚÔÑ';
 one(17) := 'ÓÈÚÉ ÚÔÑ';
 one(18) := 'ËãÇäíÉ ÚÔÑ';
 one(19) := 'ÊÓÚÉ ÚÔÑ';
 one(20) := 'ÚÔÑæä';
 one(21) := 'æÇÍÏ æÚÔÑæä';
 one(22) := 'ÅËäÇä æÚÔÑæä';
 one(23) := 'ËáÇËÉ æÚÔÑæä';
 one(24) := 'ÃÑÈÚÉ æÚÔÑæä';
 one(25) := 'ÎãÓÉ æÚÔÑæä';
 one(26) := 'ÓÊÉ æÚÔÑæä';
 one(27) := 'ÓÈÚÉ æÚÔÑæä';
 one(28) := 'ËãÇäíÉ æÚÔÑæä';
 one(29) := 'ÊÓÚÉ æÚÔÑæä';
 one(30) := '臂辊';
 one(31) := 'æÇÍÏ æËáÇËæä';
 one(32) := 'ÅËäÇä æËáÇËæä';
 one(33) := 'ËáÇËÉ æËáÇËæä';
 one(34) := 'ÃÑÈÚÉ æËáÇËæä';
 one(35) := 'ÎãÓÉ æËáÇËæä';
 one(36) := 'ÓÊÉ æËáÇËæä';
 one(37) := 'ÓÈÚÉ æËáÇËæä';
 one(38) := 'ËãÇäíÉ æËáÇËæä';
 one(39) := 'ÊÓÚÉ æËáÇËæä';
 one(40) := 'ÃÑÈÚæä';
 one(41) := 'æÇÍÏ æÃÑÈÚæä';
 one(42) := 'ÅËäÇä æÃÑÈÚæä';
 one(43) := 'ËáÇËÉ æÃÑÈÚæä';
 one(44) := 'ÃÑÈÚÉ æÃÑÈÚæä';
 one(45) := 'ÎãÓÉ æÃÑÈÚæä';
 one(46) := 'ÓÊÉ æÃÑÈÚæä';
 one(47) := 'ÓÈÚÉ æÃÑÈÚæä';
 one(48) := 'ËãÇäíÉ æÃÑÈÚæä';
 one(49) := 'ÊÓÚÉ æÃÑÈÚæä';
 one(50) := 'ÎãÓæä';
 one(51) := 'æÇÍÏ æÎãÓæä';
 one(52) := 'ÅËäÇä æÎãÓæä';
 one(53) := 'ËáÇËÉ æÎãÓæä';
 one(54) := 'ÃÑÈÚÉ æÎãÓæä';
 one(55) := 'ÎãÓÉ æÎãÓæä';
 one(56) := 'ÓÊÉ æÎãÓæä';
 one(57) := 'ÓÈÚÉ æÎãÓæä';
 one(58) := 'ËãÇäíÉ æÎãÓæä';
 one(59) := 'ÊÓÚÉ æÎãÓæä';
 one(60) := 'ÓÊæä';
 one(61) := 'æÇÍÏ æÓÊæä';
 one(62) := 'ÅËäÇä æÓÊæä';
 one(63) := 'ËáÇËÉ æÓÊæä';
 one(64) := 'ÃÑÈÚÉ æÓÊæä';
 one(65) := 'ÎãÓÉ æÓÊæä';
 one(66) := 'ÓÊÉ æÓÊæä';
 one(67) := 'ÓÈÚÉ æÓÊæä';
 one(68) := 'ËãÇäíÉ æÓÊæä';
 one(69) := 'ÊÓÚÉ æÓÊæä';
 one(70) := 'ÓÈÚæä';
 one(71) := 'æÇÍÏ æÓÈÚæä';
 one(72) := 'ÅËäÇä æÓÈÚæä';
 one(73) := 'ËáÇËÉ æÓÈÚæä';
 one(74) := 'ÃÑÈÚÉ æÓÈÚæä';
 one(75) := 'ÎãÓÉ æÓÈÚæä';
 one(76) := 'ÓÊÉ æÓÈÚæä';
 one(77) := 'ÓÈÚÉ æÓÈÚæä';
 one(78) := 'ËãÇäíÉ æÓÈÚæä';
 one(79) := 'ÊÓÚÉ æÓÈÚæä';
 one(80) := 'ËãÇäæä';
 one(81) := 'æÇÍÏ æËãÇäæä';
 one(82) := 'ÅËäÇä æËãÇäæä';
 one(83) := 'ËáÇËÉ æËãÇäæä';
 one(84) := 'ÃÑÈÚÉ æËãÇäæä';
 one(85) := 'ÎãÓÉ æËãÇäæä';
 one(86) := 'ÓÊÉ æËãÇäæä';
 one(87) := 'ÓÈÚÉ æËãÇäæä';
 one(88) := 'ËãÇäíÉ æËãÇäæä';
 one(89) := 'ÊÓÚÉ æËãÇäæä';
 one(90) := 'ÊÓÚæä';
 one(91) := 'æÇÍÏ æÊÓÚæä';
 one(92) := 'ÅËäÇä æÊÓÚæä';
 one(93) := 'ËáÇËÉ æÊÓÚæä';
 one(94) := 'ÃÑÈÚÉ æÊÓÚæä';
 one(95) := 'ÎãÓÉ æÊÓÚæä';
 one(96) := 'ÓÊÉ æÊÓÚæä';
 one(97) := 'ÓÈÚÉ æÊÓÚæä';
 one(98) := 'ËãÇäíÉ æÊÓÚæä';
 one(99) := 'ÊÓÚÉ æÊÓÚæä';
 hund(0) := ' ';
 hund(1) := 'ãÇÆÉ';
 hund(2) := 'ãÇÆÊÇä';
 hund(3) := 'ËáÇËãÇÆÉ';
 hund(4) := 'ÃÑÈÚãÇÆÉ';
 hund(5) := 'ÎãÓãÇÆÉ';
 hund(6) := 'ÓÊãÇÆÉ';
 hund(7) := 'ÓÈÚãÇÆÉ';
 hund(8) := 'ËãÇäãÇÆÉ';
 hund(9) := 'ÊÓÚãÇÆÉ';
 	-----------
   n_ch := lpad(to_char(trunc(n)),8,'00000000');
   n1 := nvl(to_number(substr(n_ch,1,2)),0);
   n2 := nvl(to_number(substr(n_ch,3,1)),0);
   n3 := nvl(to_number(substr(n_ch,4,2)),0);
   n4 := nvl(to_number(substr(n_ch,6,1)),0);
   n5 := nvl(to_number(substr(n_ch,7,2)),0);
   n6 := nvl(mod(n,1),0);
   ch1 := one(n1);
   ch2 := hund(n2);
   ch3 := one(n3);
   ch4 := hund(n4);
   ch5 := one(n5);
   ch6 := lpad(rpad(to_char(n6*1000),4,' '),5,' ');
   if (n1<>0) and (n2<>0 or n3<>0 or n4<>0 or n5<>0)	then and1 := ' æ '; end if;
   if (n2<>0) and (n3<>0 or n4<>0 or n5<>0)		then and2 := ' æ '; end if;
   if (n3<>0 or n2<>0) and (n4<>0 or n5<>0)		then and3 := ' æ '; end if;
   if (n4<>0) and (n5<>0)				then and4 := ' æ '; end if;
   if (trunc(n)<>0) and (n6<>0)		 	then and5 := ' æ '; end if;
   ch1_1 := ch1;
   ch3_3 := ch3;
   ch5_5 := ch5;
   if	nvl(n,0)=0	then	only := ' ';
			dinar := ' ';
			thousand := ' ';
   end if;
   if	(n6=0) 	then	fils := '';
			ch6 := '';
   end if;
   if	(n3=1) and (n2=0) 	then 	ch3_3 := '';
   	thousand	:= 'ÃáÝ';
   elsif (n3=2) and (n2=0) 	then 	thousand := 'ÃáÝíä';
				ch3_3 := '';
   elsif (n3>=3) and (n3<=10)	then	thousand := 'ÃáÇÝ';
   end if;
   if (n3=0) and (n2=0) and (n4<>0 or n5<>0) then thousand := ''; end if;
   if (n3=0) then and2 := ''; end if;
   if (n1=0 and n2 =0 and n3=0 and n4=0) then
     if (n5=1)	then	ch5_5 := 'ÑíÇá '||ch5;
		thousand := '';
		dinar := '';
     elsif (n5=2)	then	ch5_5 := 'ÑíÇáíä ';
		thousand := '';
		dinar := '';
     elsif (n5>=3) and (n5<=10) then 	ch5_5 := ch5 || 'ÑíÇáÇÊ ';
				thousand := '';
				dinar := '';
     end if;
   end if;
   if (n1=0 and n2 =0 and n3=0 and n4=0 and n5=0) then      
		thousand := '';
		dinar := '';
   end if;
   if 	(n1=1)	then 	milion := 'ãáíæä ';
		ch1_1 := '';
	--	thousand := '';
   elsif (n1=2)	then 	milion := 'ãáíæäíä ';
		ch1_1 := '';
   elsif (n1>=3) and (n1<=10) then milion := 'ãáÇííä ';
   elsif (n1<>0)	then	milion := 'ãáíæä ';
   end if;


   ch := ch1_1||' '||milion||and1||ch2||and2||ch3_3||' '||thousand||and3||ch4||and4||ch5_5||' '||dinar||and5||ch6||fils||' '||only;
   return(ch);

END;



و هناك مشكلة اخرى انه لأ يقرا بطريفة صحيحة بعد الـ 99 مليون .. وشكرا ...

رابط هذا التعليق
شارك

هل يمكن لهذه الخوارزمية أن تعالج الأعداد الحقيقية، بوجود أرقام عشرية؟
بالأخص عندما نحتاج إلى تفقيط قيمة مالية لتتم كتابتها على شيك على سبيل المثال.

رابط هذا التعليق
شارك

  • بعد 1 شهر...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية