PDA

View Full Version : آموزش: تابع تبدیل عدد به حروف در FastReport



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

reza_mti
سه شنبه 13 دی 1390, 11:00 صبح
بسیار مفید بود

moj4030
دوشنبه 04 شهریور 1392, 10:33 صبح
سلام با عرض پوزش
من یک پروژه دارم که اعداد به صورت رشته ای 1223 وارد می شوند که من می خوام بین انها ویگول گذاشته یا عملیات ریاضی انجام بدم به خاطر همین می خواست بدونم که چه جوری این رشته را در فست رپورت به عدد اینتیجر یا دابل تبدیل کنم

moj4030
دوشنبه 04 شهریور 1392, 10:34 صبح
سلام با عرض پوزش
من یک پروژه دارم که اعداد به صورت رشته ای 1223 وارد می شوند که من می خوام بین انها ویگول گذاشته یا عملیات ریاضی انجام بدم به خاطر همین می خواست بدونم که چه جوری این رشته را در فست رپورت به عدد اینتیجر یا دابل تبدیل کنم

saeedjaihoni
یک شنبه 27 اردیبهشت 1394, 11:25 صبح
سلام
ببین این کد چطوره

درقسمت implementation تابع زیر را بنویسید:




const

yekan : array[0..9] of string = ('صفر','يک','دو','سه','چهار','پنج' ,'شش','هفت','هشت','نه');

dahgan : array[0..9] of string = ('','','بيست','سي','چهل','پنجاه','ش صت','هفتاد','هشتاد','نود');

dahyek : array[10..19] of string = ('ده','يازده','دوازده','سيزده',' چهارده','پانزده','شانزده','هف ه','هجده','نوزده');

sadgan : array[0..9] of string = ('','يکصد','دويست','سيصد','چهارص د','پانصد','ششصد','هفتصد','هشتص د','نهصد');

base : array[0..4] of string = ('','هزار','ميليون','ميليارد','ت ريليون');



// تابع تبديل عدد به حروف

function number_to_word(snum : string) : string;

// تابع تبدیل عدد سه رقمی به حروف

function getnum3(num3 : integer) : string;

var

s : string;

d1, d2, d3, d12 : integer;

begin

d12 := num3 mod 100; // دو رقم اول

d3 := num3 div 100; // صدگان

if d3 <> 0 then

s := sadgan[d3] + ' و ';

// نام گذاري اعداد 10 تا 19 در بين

// اعداد دو رقمي استثنا است

if (d12 >= 10) and (d12 <= 19) then

begin

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;

getnum3 := s;

end;



var

L, i, b : integer;

stotal : string;

begin

// اگر عدد صفر بود، يکراست نتيجه را برگردان

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

// اگر سه رقم به دست آمده صفر باشد، در نام عدد تاثيري ندارد

// نام قسمت سه رقمي را بدست مي آوريمgetnum3 با استفاده از تابع

// پسوند را به آن اضافه مي کنيمbase با استفاده از آرايه

if b <> 0 then

stotal := stotal + getnum3(b) + ' ' + base[L - i] + ' و ';

end;

// حذف حرف <و> اضافي

stotal := copy(stotal, 1, length(stotal) - 3);

result := stotal;

end;

end;




مثال با دو عنصر Edit و یک Button

procedure TForm1.Button1Click(Sender: TObject);

begin

if Edit2.Text=''then

begin

Edit1.Text:='0';

end;

Edit1.Text:= number_to_word(Edit2.Text);

end;

amirkazem
شنبه 27 تیر 1394, 00:59 صبح
باسلام وآرزوی قبولی طاعات وتبریک عیدسعیدفطر،
بنده کدهای موجودرادرقسمت کدنویسی گزارش کپی کردم.وبه عرض برسونم که ازطریق یک کوئری درفرم برنامه مجموع یک فیلدرامحاسبه میکنم. که درقسمت (ColumnFooter)یک همان 1000=Exper که مربوط به همان (FRXDBDataset)هستش راقرارداده ام. مجموع مبلغ درپای ستون به رقم درگزارشات صحیح نمایش داده میشه ومن میخوام همین رقم به صورت حروف هم نمایش داده بشه که متأسفانه نمایش داده نمیشه. ضمناً مثالی که شماگذاشته بودیدرا وقتی قرارمیدم، فقط به حروف (صفر) رانمایش میده.
ممنون میشم اگرراهنمایی بفرمایید.

danesh1351
دوشنبه 29 تیر 1394, 10:26 صبح
راه ساده تر
تابع رو تو سورس دلفی بذار
اون رو به توابع فست معرفی کن
از هر جای گزارش فست که میخوای قابل خوندنه و نیاز نیست برای هر گزارشی کپی بشه .