টপিকঃ পিএইচপিতে একটু সাহায্য প্রয়োজন

শিরোনামের জন্য প্রথমেই দুঃখ প্রকাশ করছি। শিরোনামে ঠিক কী লেখা যেতে পারে তা বুঝে উঠতে পারছিলাম না। sad

নির্দিষ্ট ১৫০টি ফ্লোটিং পয়েন্ট মানের যে কোন একটি মান ইউজার ইনপুট হিসেবে প্রবেশ করাবে যা একটি ভ্যারিয়েবলে সংরক্ষণ করা হবে। ইউজার ইনপুটগুলো ইংরেজিতে দিবে। এখন ঐ ইনপুটগুলো বাংলাতে প্রিন্ট করতে হবে।

আমি সুইচ-কেইস স্টেইটমেন্ট ব্যবহার করে ঐ ইংরেজি মানগুলোর বিপরীতে বাংলাতে মান স্ট্রিং হিসেবে ভ্যারিয়েবলটিতে সংরক্ষণ করছি। ফলে ঐ ১৫০টি মানের জন্যই আমাকে নিচের মত অনেকবার লিখতে হচ্ছে,

case 123.45:
  $x = "১২৩.৪৫";
  break;

সংখ্যা যেহেতু মাত্র ১০টি, তাই আমি চাচ্ছি এমন কিছু করতে যা দিয়ে মাত্র ০ থেকে ৯ পর্যন্ত সংখ্যার জন্য সুইচ-কেইস স্টেইটমেন্ট ব্যবহার করে ঐ ভ্যারিয়েবলের যে কোন মানই ইংরেজি থেকে বাংলাতে রূপান্তর করব।

ভিবি.নেটে এ্যারেতে মান রেখে এবং স্প্লিট ফাংশন ব্যবহার করে কিছু কাজ করেছিলাম। ভাবছি ঐ রকম কিছু করে হয়ত এখানে কোডিং কমিয়ে আনা যেতে পারে।

twitter · last.fm

Currently Playing: Nier: Automata

লেখাটি CC by-nc-sa 3.0 এর অধীনে প্রকাশিত

সর্বশেষ সম্পাদনা করেছেন হৃদয় (০৫-০২-২০১২ ০৪:০৮)

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

আমার মাথায় যেটা এলো সেটা এরকম-

১) ইন্টিজার আর ফ্র্যাকশান পার্ট দুটো আলাদা করে নেওয়া।

$int = intval(123.45);
$fract = 123.45 - $int;

২)লুপ চালিয়ে দুটো পার্টেরই প্রত্যেকটা ডিজিট আলাদা করে নেওয়া এবং দুটি অ্যারেতে রাখা।
[ইন্টিজার পার্টের ক্ষেত্রে 10 এর ভাগশেষ নিলে শেষ ডিজিটটা পাওয়া যাবে, ফ্র্যাকশানের ক্ষেত্রে 10 এর গুণফলের ইন্টিজার পার্ট নিলে প্রথম ডিজিটটা পাওয়া যাবে]

৩) 0 থেকে 9 পর্যন্ত সুইচ কেস চালিয়ে প্রত্যেকটা ডিজিটের জন্য অ্যারেতে তার বাংলা মানটি বের করার একটি ফাংশান তৈরি করে সেটাকে লুপের মধ্যে কল করে অ্যারেতে থাকা ডিজিটগুলোকে তাদের বাংলা মান দিয়ে রিপ্লেস করে নেওয়া।

৪) সবশেষে তিনটে বাংলা ডিজিট, একটা দশমিক চিহ্ন, দুটো বাংলা ডিজিট Concatenation (.) এর মাধ্যমে একসাথে প্রিন্ট করিয়ে দেওয়া।

এক্ষেত্রে কেসগুলি মোট 150 বারের বদলে 5*10 = 50 বার এক্সিকিউট হচ্ছে।

আমি নিজে পুরো কাজটা করে দেখিনি। অতএব কাজটা হবে কিনা নিশ্চিত নই।

"No ship should go down without her captain."

হৃদয়১'এর ওয়েবসাইট

লেখাটি LGPL এর অধীনে প্রকাশিত

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

সবচেয়ে সহজ বুদ্ধি হচ্ছে ইউজার ইনপুট ফ্লোটিং পয়েন্ট দিলেও আপনি তাকে স্ট্রিং এ কনভার্ট করুন। তারপর সিম্পল স্ট্রিং রিপ্লেস।

সর্বশেষ সম্পাদনা করেছেন invarbrass (০৫-০২-২০১২ ১০:২৫)

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

আগন্তুক মিলন লিখেছেন:

সবচেয়ে সহজ বুদ্ধি হচ্ছে ইউজার ইনপুট ফ্লোটিং পয়েন্ট দিলেও আপনি তাকে স্ট্রিং এ কনভার্ট করুন। তারপর সিম্পল স্ট্রিং রিপ্লেস।


এটাই সবচাইতে সহজ পদ্ধতি - ফ্লোট ভ্যালুটিকে পিএইচপির strval()/sprintf()/number_format() ফাংশন দিয়ে স্ট্রিং-ইফাই করুন। এরপর স্ট্রিং-এর প্রতিটি ক্যারেক্টার লুপিং করে বেংগলীফাই করে ফেলুন।  tongue
পিএইচপি নিয়ে অনেকদিন ঘাটাঘাটি করি না, তাই পাইথনে (কমেন্টেড) স্যাম্পলটা দিলাম:

EN_NUMERALS = ['1', '2', '3', '.'] # ইংরেজী নাম্বারের এ্যারে... অসম্পূর্ণ
BN_NUMERALS = [u'১', u'২', u'৩', '.'] # বাংলা সংখ্যার এ্যারে (ইউনিকোড)
# উপরের এ্যারে দু'টিতে ডেসিমেল সেপারেটর বা "." সিম্বলটি খেয়াল করুন

input_str = '123.321' # ইনপুট: ইংরেজী সংখ্যার স্ট্রিং
out_array = [] # আউটপুট এ্যারে
for c in input_str:                             # স্ট্রিং-এর প্রতিটি ক্যারেক্টারে লুপ করলাম
    idx = EN_NUMERALS.index(c)    # ইংরেজী অক্ষরটির এ্যারে ইনডেক্স বের করলাম
    bn_char = BN_NUMERALS[idx]  # ঐ ইনডেক্স নাম্বার দিয়ে বাংলা অক্ষরটি বের করলাম
    out_array.append(bn_char)        # বাংলা অক্ষরটি আউটপুট এ্যারে-তে যোগ করলাম
    
output_str = "".join(out_array)    #এবার এ্যারের সব অক্ষর জয়েন করে স্ট্রিং তৈরী করি

বাই দি ওয়ে, উপরের কোডটি শুধুমাত্র বোঝার সুবিধার জন্য ডামী (পড়ুন পিএইচপি  wink) মোডে দিয়েছি। ইডিওমেটিক পাইথনে পুরো কোডটি এক লাইনেই করা যায় (এবং তাই করা উচিৎ... আই মীন ল্যাংগুয়েজে যদি সেই ক্ষমতা থাকে আরকি  tongue)

output_str = "".join([BN_NUMERALS[EN_NUMERALS.index(x)] for x in input_str])
Calm... like a bomb.

সর্বশেষ সম্পাদনা করেছেন জেলাল (০৫-০২-২০১২ ১১:২৮)

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

এরকম করলে কেমন হয়:

<?php
$num = $_GET["num"]; //স্যাম্পল ইনপুট (আপনার ইউজার ইনপুট)

$num = str_replace("0", "০", $num);

$num = str_replace("1", "১", $num);

$num = str_replace("2", "২", $num);

$num = str_replace("3", "৩", $num);

$num = str_replace("4", "৪", $num);

$num = str_replace("5", "৫", $num);

$num = str_replace("6", "৬", $num);

$num = str_replace("7", "৭", $num);

$num = str_replace("8", "৮", $num);

$num = str_replace("9", "৯", $num);

echo $num;
?>

কিংবা:

<?php
$num = $_GET["num"]; //স্যাম্পল ইনপুট (আপনার ইউজার ইনপুট)
$beng_array = array("০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯");

for ($eng = 0; $eng < 10; $eng++)
{
    $num = str_replace($eng, $beng_array[$eng], $num);
}

echo $num;
?>

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

ইনভারব্রাস ভাই যা লিখলেন আমি ঐ রকম কিছু করতে চেয়েছিলাম। তবে জেলাল ভাইয়ের দেওয়া সমাধানটিতো আরও সহজ মনে হচ্ছে। যাই হোক, রাতে পিএইচপি নিয়ে বসব।

twitter · last.fm

Currently Playing: Nier: Automata

লেখাটি CC by-nc-sa 3.0 এর অধীনে প্রকাশিত

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

কোড পড়ে যা বুঝলাম তা হল, ইংরেজী ডিজিট থেকে বাংলা ডিজিটে রুপান্তর করতে চাইছ। এটা একটা ফাংশন কলেই করা যাবে।

$bn_digit=array('০','১','২','৩','৪','৫','৬','৭','৮','৯');
$output = str_replace(range(0, 9),$bn_digit, $input);


টেস্ট করার জন্য নিচের কোড রান করলেই হবে। আউটপুট হবে 1.

$expected ="১২৩,৪৫.০৬৭";
$input  ="123,45.067";

$output = str_replace(
            range(0, 9),
            array('০','১','২','৩','৪','৫','৬','৭','৮','৯'), 
            $input
        );

echo $output===$expected;
Feed থেকে ফোরাম সিগনেচার, imgsign.com
ব্লগ: shiplu.mokadd.im
মুখে তুলে কেউ খাইয়ে দেবে না। নিজের হাতেই সেটা করতে হবে।

শিপলু'এর ওয়েবসাইট

লেখাটি GPL v3 এর অধীনে প্রকাশিত

Re: পিএইচপিতে একটু সাহায্য প্রয়োজন

আপাতত জেলাল ভাইয়ের পদ্ধতিটি অনুসরণ করে সমস্যাটির সমাধান করলাম।

শিপলু ভাইয়ের পদ্ধতিটিও লোভনীয়! এটাও প্র্যাকটিস করতে হবে।

twitter · last.fm

Currently Playing: Nier: Automata

লেখাটি CC by-nc-sa 3.0 এর অধীনে প্রকাশিত