تبديل اعداد به حروف در زبانهاي برنامه نويسي گوناگون


مي خواهيم تابعي بنويسيم که يک عدد بگيرد و آن را به حروف تديل کند. ورودي و خروجي تابع از نوع string هستند.
در اين مقاله، متن برنامه به زبان delphi آورده شده است. همچنين متن برنامه به زبان هاي c#, vb6, js نيز ضميمه مقاله هستند. { نمونه کد مقالات در زيانهاي برنامه نويسي گوناگون }
با استفاده از برنامه به زبان vb6 مي توانيد از اين قابليت در excel, access نيز استفاده کنيد.
جدول زير مثالي از نحوه عملکرد تابع مي باشد:



عدد
به حروف
123
يكصد و بيست و سه
123000
يكصد و بيست و سه ميليون
123000000
يكصد و بيست و سه ميليارد
7210
هفت هزار و دويست و ده
1200005
يك ميليون و دويست هزار و پنج
1648195
يك ميليون و ششصد و چهل و هشت هزار و يكصد و نود و پنج


قبل از اينکه دست به کار کد نويسي بشويم بايد مسئله را تحليل کنيم و راه حل آن را دقيق بدست بياوريم. وقتي که راه حل را يافتيم، مي توانيم راه حل مورد نظرمان را به برنامه تبديل کنيم!
با اين ايده ساده کارمان را شروع کنيم که : نام هر عدد را مي توانيم با استفاده از ترکيب تعدادي اجزاي اصلي به دست آورد. با اين ايده، بايد اجزاي اصلي را به دست آوريم. (منظور از اجزاي اصلي قسمت هاي تکراري در اسامي اعداد است براي مثال : يک، دو، سه، بيست، پانصد، هزار، ميليون و ... مي باشد).
علاوه بر اجزاي اصلي که مبناي تشکيل اعداد مي باشند، با کمي دقت در مثال بالا متوجه مي شويد که ترکيب هاي سه رقمي اعداد، خود مي توانند به عنوان اجزاي تکرار شونده به کار روند. بر حسب اينکه ترکيب سه رقمي مورد نظر در چه جايگاهي قرار بگيرد، پسوند هاي هزار، ميليون، ميليارد و ... را مي توان به آن اضافه کرد. مثلا ترکيب سه رقمي 123 را در نظر بگيريد. اگر 123 در سه رقم اول قرار بگيرند، آن را يکصد و بيست و سه مي خوانيم و اگر در سه رقم دوم قرار بگيرند آن را يکصد و بيست و سه هزار مي خوانيم و ...
مراحل زير براي تبديل اعداد به حروف مي توان پيشنهاد کرد :
<LI class=MsoNormal dir=rtl>تجزيه عدد مورد نظر به قسمت هاي سه رقمي <LI class=MsoNormal dir=rtl>ساختن نام هر يک از قسمت هاي سه رقمي (اين مرحله ر بايد بيشتر بررسي کنيم.) <LI class=MsoNormal dir=rtl>افزودن پسوند مناسب به قسمت هاي سه رقمي
ترکيب قسمت هاي سه رقمي
براي ساختن نام قسمت هاي سه رقمي به روش زير عمل مي کنيم:
ابتدا بايد تک تک رقم هاي عدد را به دست بياوريم. مي توانيم رقم ها را در يک آرايه ذخيره کنيم. با توجه به اينکه هر رقم با توجه به جايگاهي که در آن قرار دارد خوانده مي شود بايد جايگاه رقم به دست آمده را نيز در نظر داشته باشيم. . مثلا رقم 3 در عدد 123 چون در يکان قرار دارد به صورت "سه" خوانده مي شود، اما در عدد 135 به صورت "سي" خوانده مي شود و در عدد 398 به صورت "سيصد" خوانده مي شود.
حالت هاي استثنا کارمان را سخت مي کنند و بايد همه آن ها را شناسايي کنيم. مثلا اعداد 10 تا 19 حالت استثنا هستند.
فهرست زير شامل اجزاي اصلي مورد نياز مي باشد :



صفر، يک، دو، سه، چهار، پنج، شش، هفت، هشت، نه
بيست، سي، چهل، پنجاه، شصت، هفتاد، هشتاد، نود
ده، يازده، دوازده، سيزده، چهارده، پانزده، شانزده، هفده، هجده، نوزده
يکصد، دويست، سيصد، چهارصد، پانصد، ششصد، هفتصد، هشتصد، نهصد
هزار، ميليون، ميليارد، تريليون


البته آرايه هايي که در برنامه تعريف شده اند، اعضاي ديگري نيز وجود دارند که براي پوشش دادن حالت هاي استثنا در نظر گرفته شده اند.
متن برنامه دلفي به همراه توضيحات:


کد:
const yekan : array[0..9] of string = ('صفر','يک','دو','سه','چهار','پنج' ,' شش','هفت','هشت','نه'); dahgan : array[0..9] of string = ('','','بيست','سي','چهل','پنجاه','ش صت','0 ?فتاد','هشتاد','نود'); dahyek : array[10..19] of string = ('ده','يازده','دوازده','سيزده',' چ هارده','پانزده','شانزده','هفد0 ?','هجده','نوزده'); sadgan : array[0..9] of string = ('','يکصد','دويست','سيصد','چهارص د',' پانصد','ششصد','هفتصد','هشتصد',' نهصد'); base : array[0..4] of string = ('','هزار','ميليون','ميليارد','ت ري0 ?يون'); // تابع تبديل عدد به حروف 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;