PHP-তে কোনো নাম্বারকে বাংলা কথায় প্রকাশ করা

সর্বশেষ আপডেট:

আগের নিবন্ধে আমরা PHP-তে বাংলা সংখ্যা নিয়ে কিছু কাজ করেছিলাম। ঐ নিবন্ধের শেষের দিকে আমরা দেখেছিলাম PHP-তে কীভাবে কোনো সংখ্যাকে এক ডিজিট এক ডিজিট করে কথায় প্রকাশ করা যায়। এখন এই নিবন্ধে আমরা দেখব কীভাবে কোনো স্বাভাবিক সংখ্যাকে, অর্থাৎ দশমিক বিহীন সংখ্যাকে বাংলা কথায় প্রকাশ করা যায়।

স্বাভাবিক সংখ্যাকে কথায় প্রকাশ করার জন্যে নিচের ফাংশনটি ব্যবহার করা যায়। এটি ৯৯,৯৯,৯৯,৯৯৯.৯৯৯ (নিরানব্বই কোটি…) পর্যন্ত কাজ করে।

function bn_word($integer) {
	
	if (!is_numeric($integer)) return "Not a number";
	if (is_float($integer)) return "Integers only.";
	if ($integer > 999999999) return "Too large number.";
	if ($integer == 0) return "শূন্য";
	
	$num_to_bn_word = array(
		'শূন্য ', 'এক ', 'দুই ', 'তিন ', 'চার ', 'পাঁচ ', 'ছয় ', 'সাত ', 'আট ', 'নয় ', 'দশ ',
		'এগারো ', 'বার ', 'তের ', 'চৌদ্দ ', 'পনের ', 'ষোল ', 'সতের ', 'আঠার ', 'উনিশ ', 'বিশ ',
		'একুশ ', 'বাইশ ', 'তেইশ ', 'চব্বিশ ', 'পঁচিশ ', 'ছাব্বিশ ', 'সাতাশ ', 'আটাশ ', 'ঊনত্রিশ ', 'ত্রিশ ',
		'একত্রিশ ', 'বত্রিশ ', 'তেত্রিশ ', 'চৌত্রিশ ', 'পঁয়ত্রিশ ', 'ছত্রিশ ', 'সাঁইত্রিশ ', 'আটত্রিশ ', 'ঊনচল্লিশ ', 'চল্লিশ ',
		'একচল্লিশ ', 'বিয়াল্লিশ ', 'তেতাল্লিশ ', 'চৌচল্লিশ ', 'পঁয়তাল্লিশ ', 'ছিচল্লিশ ', 'সাতচল্লিশ ', 'আটচল্লিশ ', 'ঊনপঞ্চাশ ', 'পঞ্চাশ ',
		'একান্ন ', 'বায়ান্ন ', 'তিপ্পান্ন ', 'চুয়ান্ন ', 'পঞ্চান্ন ', 'ছাপ্পান্ন ', 'সাতান্ন ', 'আটান্ন ', 'ঊনষাট ', 'ষাট ',
		'একষট্টি ', 'বাষট্টি ', 'তিষট্টি ', 'চৌষট্টি ', 'পঁয়ষট্টি ', 'ছিষট্টি ', 'সাতষট্টি ', 'আষট্টি ', 'ঊনসত্তর ', 'সত্তর ',
		'একাত্তর ', 'বায়াত্তর ', 'তিয়াত্তর ', 'চুয়াত্তর ', 'পঁচাত্তর ', 'ছিয়াত্তর ', 'সাতাত্তর ', 'আটাত্তর ', 'ঊনআশি ', 'আশি ',
		'একাশি ', 'বিরাশি ', 'তিরাশি ', 'চুরাশি ', 'পঁচাশি ', 'ছিষাশি ', 'সাতাশি ', 'আটাশি ', 'ঊননব্বই ', 'নব্বই ',
		'একানব্বই ', 'বিরানব্বই ', 'তিরানব্বই ', 'চুরানব্বই ', 'পঁচানব্বই ', 'ছিয়ানব্বই ', 'সাতানব্বই ', 'আটানব্বই ', 'নিরানব্বই '
	);
	
	$crore_num = substr('000000000' . $integer, -9);
	$word_incl_zero = preg_replace('/(\d\d)(\d\d)(\d\d)(\d)(\d\d)/', '$1 কোটি $2 লক্ষ $3 হাজার $4 শত $5', $crore_num);
	$word_excl_zero = preg_replace('/(?<![1-9])0(.*?)(?=[1-9]|$)/', '', $word_incl_zero);
	$bn_word = strtr($word_excl_zero, $num_to_bn_word);
	
	return $bn_word;
}

ফাংশনটিকে আমরা নিচের মতো করে ব্যবহার করতে পারি।

echo bn_word(12345);

// Output
// বার হাজার তিন শত পঁয়তাল্লিশ

নিচে bn_word() ফাংশনটির কিছু ইনপুট ও আউটপুট দেয়া হলো।

Input		:	Output
-----------------------------
0 			:	শূন্য
9			:	নয়
70			:	সত্তর
100			:	এক শত
101			:	এক শত এক
111			:	এক শত এগারো
1001		:	এক হাজার এক
1010		:	এক হাজার দশ
1000007		:	দশ লক্ষ সাত
'0001'		:	এক
'10001'		:	দশ হাজার এক
1000000000	:	Too large number.
0.01		:	Integers only.
'abc'		:	Not a number

উপরিউক্ত bn_word() ফাংশনটি সম্পর্কে নিচে বিস্তারিত আলোচনা করা হল।

লাইন ১ এবং ২৭:
প্রথম লাইনে bn_word() নামে ফাংশনটি নামকরণ করা হয়েছে। এই ফাংশনটিতে $integer প্যারামিটারটি (Parameter) দেয়া হয়েছে। অর্থাৎ আমাদের কাঙ্ক্ষিত নাম্বারটিকে অবশ্যই এই ফাংশনে দিতে হবে। ২৭ নাম্বার লাইনে ফাংশনটি শেষ হয়েছে।

লাইন ৩-৫:
এখানে কিছু কন্ডিশন (Condition) ব্যবহার করা হয়েছে যেনো ভুল ইনপুট দিলে PHP এরর (Error) মেসেজ না দেখায়। যেমন, আমাদের প্রদত্ত প্যারামিটারটি অবশ্যই দশমিক বিহীন স্বাভাবিক সংখ্যা হতে হবে।

if (!is_numeric($integer)) return "Not a number";
if (is_float($integer)) return "Integers only.";
if ($integer > 999999999) return "Too large number.";
if ($integer == 0) return "শূন্য";

৯৯,৯৯,৯৯,৯৯৯ (নিরানব্বই কোটি নিরানব্বই লক্ষ নিরানব্বই হাজার নয় শত নিরানব্বই) পর্যন্ত এই ফাংশনটি কাজ করবে। তাই এর চেয়ে বড় কোনো সংখ্যা দিলে “Too Large Number” বার্তাটি return করবে। অর্থাৎ এখানেই আমাদের  ফাংশনের কাজ শেষ হয়ে যাবে। পরবর্তী ধাপে আর যাবে না।

লাইন ৬:
Zero (0)-এর ক্ষেত্রে পরবর্তী ধাপগুলো দ্বারা “শূন্য” আউটপুট পাওয়া যায় না। তাই শূন্যের ক্ষেত্রে এখানেই তা রিটার্ন করা হয়েছে। কেন “শূন্য” পাওয়া যায় না তা পরবর্তীতে (“লাইন ২৩”-এ) বর্ণনা করা হয়েছে।

লাইন ৮-১৯:
এখানে $num_to_bn_word ভ্যরিয়েবল (Variable)-এ একটি অ্যারে (Array) স্টোর করা হয়েছে। PHP-তে অ্যারে যেহেতু Zero (0) ইনডেক্স বিশিষ্ট হয়, তাই ০-৯৯ পর্যন্ত প্রতিটি সংখ্যার বাংলা শব্দ দ্বারা জোড় গঠিত হয়েছে।

$num_to_bn_word = array(
  0 => 'শূন্য ',
  1 => 'এক ',
  2 => 'দুই ',
  // ....
);

লাইন ২১:
সংখ্যাটি অবশ্যই নয় ডিজিট সম্পন্ন হতে হবে। নয় ডিজিট পূর্ণ না হলে এখানে সংখ্যার পূর্বে শূন্য (০) বসিয়ে নয় ডিজিট পূর্ণ করা হয়েছে।

$crore_num = substr('000000000' . $integer, -9);
$word_incl_zero = preg_replace('/(\d\d)(\d\d)(\d\d)(\d)(\d\d)/', '$1 কোটি $2 লক্ষ $3 হাজার $4 শত $5', $crore_num);

লাইন ২২:
‘/(\d\d)(\d\d)(\d\d)(\d)(\d\d)/’ রেগুলার এক্সপ্রেশন (Regular Expression) দ্বারা আমাদের নয়টি ডিজিটকে ২-২-২-১-২ ডিজিট-গ্রুপে বিভক্ত করা হয়েছে। $1, $2 ইত্যাদি দ্বারা ১ম গ্রুপ, ২য় গ্রুপ বুঝানো হয়েছে। preg_replace দ্বারা ১ম গ্রুপের পর কোটি, ২য় গ্রপের পর লক্ষ, ৩য় গ্রপের পর হাজার, ৪র্থ গ্রপের পর শত বসানো হয়েছে।

এই ধাপে, 123456789 সংখ্যাটি “12 কোটি 34 লক্ষ 56 হাজার 7 শত 89”-এ পরিণত হবে।
12345 সংখ্যাটি “00 কোটি 00 লক্ষ 12 হাজার 3 শত 45”-এ পরিণত হবে।

লাইন ২৩:
এই ধাপে “00 কোটি”, “00 লক্ষ” ইত্যাদি শূন্য বিশিষ্ট গ্রুপগুলোকে বাদ দেয়া হয়েছে।

$word_excl_zero = preg_replace('/(?<![1-9])0(.*?)(?=[1-9]|$)/', '', $word_incl_zero);
$bn_word = strtr($word_excl_zero, $num_to_bn_word);

return $bn_word;

এখানে '/(?<![1-9])0(.*?)(?=[1-9]|$)/' রেগুলার এক্সপ্রেশনটি ব্যবহৃত হয়েছে। এর সংক্ষিপ্ত বর্ণনা নিম্নরূপ।

  1. 0(.*?) দ্বারা বুঝানো হয়েছে 0 (Zero)-এর ডানপাশে যেকোনো ক্যারেক্টার (Character) থাকতে পারে। ক্যারেক্টারের সংখ্যা শূন্য থেকে অসংখ্য হতে পারে।
  2. 0(.*?)(?=[1-9]|$) দ্বারা 0 (Zero) থেকে ডানপাশে 1 থেকে 9 পর্যন্ত অথবা লাইনের শেষ পর্যন্ত ম্যাচ (Match) করা হয়েছে।
  3. (?<![1-9])0 দ্বারা বুঝানো হয়েছে যে, 0 (Zero)-এর আগে 1-9 পর্যন্ত কোনো ডিজিট থাকতে পারবে না। ফলে “10 লক্ষ 25 হাজার”-এর “0 লক্ষ” ম্যাচ করবে না।

0 (Zero)-এর ক্ষেত্রে, লাইন ২২ ধাপে আমরা পাই, “00 কোটি 00 লক্ষ 00 হাজার 0 শত 00”, যা এই ধাপে ফাঁকা স্ট্রিং (Empty String)-এ পরিণত হয়। তাই শূন্যের ক্ষেত্রে এটি ব্যবহার করা যায় না।

লাইন ২৪:
এখানে প্রতি গ্রুপের সংখ্যাগুলোকে বাংলা কথায় পরিবর্তিত করা হয়েছে।

লাইন ২৬:
উপরিউক্ত ধাপগুলোতে আমাদের কাঙ্ক্ষিত আউটপুট তৈরি হয়েছে যা এখানে রিটার্ন করা হয়েছে।

শেয়ার, কমেন্ট, মেইল বা প্রিন্ট করুন

Leave a Reply