بسمه تعالی
می خواهیم تابعی بنویسیم که یک عدد بگیرد و آن را به حروف تدیل کند. ورودی و خروجی تابع از نوع string هستند.
در این مقاله، متن برنامه به زبان delphi آورده شده است. همچنین متن برنامه به زبان های C#, vb6, js نیز ضمیمه مقاله هستند. فایل ضمیمه در انتهای مقاله وجود دارد
با استفاده از برنامه به زبان vb6 می توانید از این قابلیت در excel, access نیز استفاده کنید.
لازم به ذکر است که این مقاله را مدتی پیش در سایت http://prdev.com ارائه داده بودم
-----------------------------------------
مثال زیر نحوه عملکرد تابع می باشد:
ورودی : خروجی
123 : یکصد و بیست و سه
123000 : یکصد و بیست و سه میلیون
123000000 : یکصد و بیست و سه میلیارد
7210 : هفت هزار و دویست و ده
1200005 : یک میلیون و دویست هزار و پنج
1648195 : یک میلیون و ششصد و چهل و هشت هزار و یکصد و نود و پنج
قبل از اینکه دست به کار کد نویسی بشویم باید مسئله را تحلیل کنیم و راه حل آن را دقیق بدست بیاوریم. وقتی که راه حل را یافتیم، می توانیم راه حل مورد نظرمان را به برنامه تبدیل کنیم!
با این ایده ساده کارمان را شروع کنیم که : نام هر عدد را می توانیم با استفاده از ترکیب تعدادی اجزای اصلی به دست آورد. با این ایده، باید اجزای اصلی را به دست آوریم. (منظور از اجزای اصلی قسمت های تکراری در اسامی اعداد است برای مثال : یک، دو، سه، بیست، پانصد، هزار، میلیون و ... می باشد).
علاوه بر اجزای اصلی که مبنای تشکیل اعداد می باشند، با کمی دقت در مثال بالا متوجه می شوید که ترکیب های سه رقمی اعداد، خود می توانند به عنوان اجزای تکرار شونده به کار روند. بر حسب اینکه ترکیب سه رقمی مورد نظر در چه جایگاهی قرار بگیرد، پسوند های هزار، میلیون، میلیارد و ... را می توان به آن اضافه کرد. مثلا ترکیب سه رقمی 123 را در نظر بگیرید. اگر 123 در سه رقم اول قرار بگیرند، آن را یکصد و بیست و سه می خوانیم و اگر در سه رقم دوم قرار بگیرند آن را یکصد و بیست و سه هزار می خوانیم و ...
مراحل زیر برای تبدیل اعداد به حروف می توان پیشنهاد کرد :
1. تجزیه عدد مورد نظر به قسمت های سه رقمی
2. ساختن نام هر یک از قسمت های سه رقمی (این مرحله ر باید بیشتر بررسی کنیم.)
3. افزودن پسوند مناسب به قسمت های سه رقمی
4. ترکیب قسمت های سه رقمی
برای ساختن نام قسمت های سه رقمی به روش زیر عمل می کنیم:
ابتدا باید تک تک رقم های عدد را به دست بیاوریم. می توانیم رقم ها را در یک آرایه ذخیره کنیم. با توجه به اینکه هر رقم با توجه به جایگاهی که در آن قرار دارد خوانده می شود باید جایگاه رقم به دست آمده را نیز در نظر داشته باشیم. . مثلا رقم 3 در عدد 123 چون در یکان قرار دارد به صورت "سه" خوانده می شود، اما در عدد 135 به صورت "سی" خوانده می شود و در عدد 398 به صورت "سیصد" خوانده می شود.
حالت های استثنا کارمان را سخت می کنند و باید همه آن ها را شناسایی کنیم. مثلا اعداد 10 تا 19 حالت استثنا هستند.
فهرست زیر شامل اجزای اصلی مورد نیاز می باشد :
. صفر، یک، دو، سه، چهار، پنج، شش، هفت، هشت، نه
. بیست، سی، چهل، پنجاه، شصت، هفتاد، هشتاد، نود
. ده، یازده، دوازده، سیزده، چهارده، پانزده، شانزده، هفده، هجده، نوزده
. یکصد، دویست، سیصد، چهارصد، پانصد، ششصد، هفتصد، هشتصد، نهصد
. هزار، میلیون، میلیارد، تریلیون
البته آرایه هایی که در برنامه تعریف شده اند، اعضای دیگری نیز وجود دارند که برای پوشش دادن حالت های استثنا در نظر گرفته شده اند.
متن برنامه دلفی به همراه توضیحات:
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 num2str(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;