rk1983xx
دوشنبه 15 فروردین 1390, 20:25 عصر
با سلام خدمت همه دوستان عزیز
مدتیه توی fast report نیاز به یک تابع جهت تبدیل اعداد به حدوف دارم
تاپیک های مختلفی برای ارتباط توابع نوشته شده در دلفی وجود داشت که اون روش مشکلات خاص خودش رو داشت
یه سری از دوستان هم راه حل ذخیره مقدار حروف رو در یک فیلد پیشنهاد داده بودند (که به نظر من باعث افزونگی میشه:اشتباه:)
ولی اصل FastScript رای اینه که ما از این دنگ و فنگ ها خلاص بشیم و مستقل عمل کنیم
متأسفانه راهنمای خود فست اسکریپت هم مثال های ملموسی نداره و با کلی سعی و خطا و پس از 2 روز کار و Trace مداوم بالاخره تونستم تابع مذکور رو که برای محیط دلفی وجود داشت (خودم ننوشتم فقط کپی کردم) در محیط FastScript بازنویسی کردم و به خوبی ازش جواب گرفتم
اینجا برای شما قرار میدم تا این قدم با شما شریک بشم
function num2str(x:string) : string;
const
yekan=['صفر','يک','دو','سه','چهار','پنج', 'شش','هفت','هشت','نه'];
dahgan=['','','بيست','سي','چهل','پنجاه','ش ت','هفتاد','هشتاد','نود'];
dahyek=['ده','يازده','دوازده','سيزده',' هارده','پانزده','شانزده','هفد ه','هجده','نوزده'];
sadgan=['','يکصد','دويست','سيصد','چهارص ','پانصد','ششصد','هفتصد','هشتص ','نهصد'];
base=['','هزار','ميليون','ميليارد','ت يليون'];
var
L, i, b : integer;
stotal,snum : string;
s : string;
d1, d2, d3, d12 : integer;
function getnum3(num3 : integer) : string;
begin
s:='';
d12:= num3 mod 100;
d3:= num3 div 100;
if d3 <> 0 then s := sadgan[d3] + ' و ';
if (d12 >= 10) and (d12 <= 19) then
begin
d12:=d12-10;
s := s + dahyek[d12];
end
else
begin
d2 := d12 div 10;
if d2 <> 0 then s := s + dahgan[d2] + ' و ';
d1 := d12 mod 10;
if d1 <> 0 then s := s + yekan[d1] + ' و ';
s := copy(s, 1, length(s) - 3);
end;
Result := s;
end;
begin
stotal:='';
snum:=x;
l:=0;
i:=0;
b:=0;
if snum='0' then
result := yekan[0]
else
begin
for i := Length(snum) to ((((Length(snum) - 1) div 3) + 1) * 3) - 1 do snum :='0'+snum;
L := (Length(snum) div 3) - 1;
for i := 0 to L do
begin
b := strtoint(copy(snum ,(i * 3)+1, 3));
if b <> 0 then
stotal := stotal + getnum3(b) + ' ' + base[L - i] + ' و ';
end;
stotal := copy(stotal, 1, length(stotal) - 3);
Result := stotal;
end;
end;
begin
end.
:چشمک:تشکر یادتون نره :چشمک:
فقط کافیه محتوای فایل رو در قسمت کد گزارش خودتون کپی کنید و هر جا که خواستید عدد یا فیلدی رو به حروف تبدیل کنید از فرمت زیر استفاده کنید :
[Trim(Num2Str(نام فیلد و یا مقدار رشته ای عدد))]
برای مثال :
[Trim(Num2Str(<frxDBDataset1."RemBar">))]
[Trim(Num2Str('123456'))]
68309
مدتیه توی fast report نیاز به یک تابع جهت تبدیل اعداد به حدوف دارم
تاپیک های مختلفی برای ارتباط توابع نوشته شده در دلفی وجود داشت که اون روش مشکلات خاص خودش رو داشت
یه سری از دوستان هم راه حل ذخیره مقدار حروف رو در یک فیلد پیشنهاد داده بودند (که به نظر من باعث افزونگی میشه:اشتباه:)
ولی اصل FastScript رای اینه که ما از این دنگ و فنگ ها خلاص بشیم و مستقل عمل کنیم
متأسفانه راهنمای خود فست اسکریپت هم مثال های ملموسی نداره و با کلی سعی و خطا و پس از 2 روز کار و Trace مداوم بالاخره تونستم تابع مذکور رو که برای محیط دلفی وجود داشت (خودم ننوشتم فقط کپی کردم) در محیط FastScript بازنویسی کردم و به خوبی ازش جواب گرفتم
اینجا برای شما قرار میدم تا این قدم با شما شریک بشم
function num2str(x:string) : string;
const
yekan=['صفر','يک','دو','سه','چهار','پنج', 'شش','هفت','هشت','نه'];
dahgan=['','','بيست','سي','چهل','پنجاه','ش ت','هفتاد','هشتاد','نود'];
dahyek=['ده','يازده','دوازده','سيزده',' هارده','پانزده','شانزده','هفد ه','هجده','نوزده'];
sadgan=['','يکصد','دويست','سيصد','چهارص ','پانصد','ششصد','هفتصد','هشتص ','نهصد'];
base=['','هزار','ميليون','ميليارد','ت يليون'];
var
L, i, b : integer;
stotal,snum : string;
s : string;
d1, d2, d3, d12 : integer;
function getnum3(num3 : integer) : string;
begin
s:='';
d12:= num3 mod 100;
d3:= num3 div 100;
if d3 <> 0 then s := sadgan[d3] + ' و ';
if (d12 >= 10) and (d12 <= 19) then
begin
d12:=d12-10;
s := s + dahyek[d12];
end
else
begin
d2 := d12 div 10;
if d2 <> 0 then s := s + dahgan[d2] + ' و ';
d1 := d12 mod 10;
if d1 <> 0 then s := s + yekan[d1] + ' و ';
s := copy(s, 1, length(s) - 3);
end;
Result := s;
end;
begin
stotal:='';
snum:=x;
l:=0;
i:=0;
b:=0;
if snum='0' then
result := yekan[0]
else
begin
for i := Length(snum) to ((((Length(snum) - 1) div 3) + 1) * 3) - 1 do snum :='0'+snum;
L := (Length(snum) div 3) - 1;
for i := 0 to L do
begin
b := strtoint(copy(snum ,(i * 3)+1, 3));
if b <> 0 then
stotal := stotal + getnum3(b) + ' ' + base[L - i] + ' و ';
end;
stotal := copy(stotal, 1, length(stotal) - 3);
Result := stotal;
end;
end;
begin
end.
:چشمک:تشکر یادتون نره :چشمک:
فقط کافیه محتوای فایل رو در قسمت کد گزارش خودتون کپی کنید و هر جا که خواستید عدد یا فیلدی رو به حروف تبدیل کنید از فرمت زیر استفاده کنید :
[Trim(Num2Str(نام فیلد و یا مقدار رشته ای عدد))]
برای مثال :
[Trim(Num2Str(<frxDBDataset1."RemBar">))]
[Trim(Num2Str('123456'))]
68309