# Native Code > برنامه نویسی در Delphi > ابزارهای گزارش سازی در دلفی > آموزش: تابع تبدیل عدد به حروف در FastReport

## rk1983xx

با سلام خدمت همه دوستان عزیز
مدتیه توی 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'))]

FastReport_num_to_str.rar

----------


## reza_mti

بسیار مفید بود

----------


## moj4030

سلام با عرض پوزش 
من یک پروژه دارم که اعداد به صورت رشته ای 1223 وارد می شوند که من می خوام بین انها ویگول گذاشته یا عملیات ریاضی انجام بدم به خاطر همین  می خواست بدونم که چه جوری این رشته را در فست رپورت به عدد اینتیجر یا دابل تبدیل کنم

----------


## moj4030

سلام با عرض پوزش 
من یک پروژه دارم که اعداد به صورت رشته ای 1223 وارد می شوند که من می خوام بین انها ویگول گذاشته یا عملیات ریاضی انجام بدم به خاطر همین  می خواست بدونم که چه جوری این رشته را در فست رپورت به عدد اینتیجر یا دابل تبدیل کنم

----------


## saeedjaihoni

سلام
ببین این کد چطوره

درقسمت  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

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

----------


## danesh1351

راه ساده تر
تابع رو تو سورس  دلفی بذار
اون رو به توابع فست معرفی کن 
از هر جای گزارش فست که میخوای قابل خوندنه و نیاز نیست برای هر گزارشی کپی بشه .

----------

