আমি নিম্নলিখিত হিসাবে সংখ্যা প্রদর্শন করতে চান
- 1 ম হিসাবে 1,
- ২ য় হিসাবে,
- ...,
- 150 হিসাবে 150 তম।
আমার কোডে প্রতিটি সংখ্যার জন্য সঠিক অর্ডিনাল প্রত্যয় (সেন্ট, এনডি, আরডি বা থাই) কীভাবে খুঁজে পাব?
আমি নিম্নলিখিত হিসাবে সংখ্যা প্রদর্শন করতে চান
আমার কোডে প্রতিটি সংখ্যার জন্য সঠিক অর্ডিনাল প্রত্যয় (সেন্ট, এনডি, আরডি বা থাই) কীভাবে খুঁজে পাব?
উত্তর:
$ends = array('th','st','nd','rd','th','th','th','th','th','th');
if (($number %100) >= 11 && ($number%100) <= 13)
$abbreviation = $number. 'th';
else
$abbreviation = $number. $ends[$number % 10];
$numberআপনি যে নম্বরটি লিখতে চান তা কোথায় । যে কোনও প্রাকৃতিক সংখ্যা নিয়ে কাজ করে।
একটি ফাংশন হিসাবে:
function ordinal($number) {
$ends = array('th','st','nd','rd','th','th','th','th','th','th');
if ((($number % 100) >= 11) && (($number%100) <= 13))
return $number. 'th';
else
return $number. $ends[$number % 10];
}
//Example Usage
echo ordinal(100);
$abbreviation = ($number)? $number. $ends[$number % 10] : $number;
পিএইচপি এর জন্য বিল্ট-ইন কার্যকারিতা রয়েছে । এমনকি আন্তর্জাতিকীকরণও পরিচালনা করে!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
মনে রাখবেন যে এই কার্যকারিতাটি কেবলমাত্র পিএইচপি 5.3.0 এবং তার পরে পাওয়া যাবে।
NumberFomatter file not found। আপনি এই চারপাশে কাজ কিভাবে?
apt-get install php5-intl
পিএইচপি-র অন্তর্নির্মিত তারিখ / সময় ফাংশনগুলিতে অনুরূপ কার্যকারিতা উপকারের মাধ্যমে এটি একক লাইনে সম্পাদন করা যায়। আমি বিনীতভাবে জমা দিন:
সমাধান:
function ordinalSuffix( $n )
{
return date('S',mktime(1,1,1,1,( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
}
বিস্তারিত ব্যাখ্যা:
অন্তর্নির্মিত date()ফাংশনটিতে মাসের গণমাধ্যমের নবম দিনের পরিচালনা করার জন্য প্রত্যয় যুক্তি রয়েছে। Sফর্ম্যাট স্ট্রিংয়ে দেওয়া হলে প্রত্যয়টি ফিরে আসে :
date( 'S' , ? );
যেহেতু date()একটি টাইমস্ট্যাম্প (জন্য প্রয়োজন ?উপরে), আমরা আমাদের পূর্ণসংখ্যা পাস করব $nযেমন dayপরামিতি mktime()এবং ব্যবহারের মান ডামি 1জন্য hour, minute, second, এবং month:
date( 'S' , mktime( 1 , 1 , 1 , 1 , $n ) );
এটি আসলে মাসের এক দিনের জন্য (যেমন $n > 31) সীমার বাইরে থাকা মানগুলিতে কৌতূহলজনকভাবে ব্যর্থ হয় তবে আমরা কিছু সাধারণ ইনলাইন যুক্তি যুক্ত করতে পারি $n29 এ:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20))*10 + $n%10) ));
একমাত্র ইতিবাচক মান( মে 2017 ) এটি ব্যর্থ হয় $n == 0তবে এটি বিশেষ ক্ষেত্রে 10 যুক্ত করে সহজেই স্থির করা হয়:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
আপডেট, মে 2017
@ ডোনাটজে দ্বারা পর্যবেক্ষণ অনুসারে, উপরেরগুলি 100 এর উপরে ব্যর্থ হয় (যেমন "111 ম"), কারণ >=20চেকগুলি সর্বদা সত্য হয়। এই প্রতি শতাব্দী পুনরায় সেট করতে, আমরা তুলনায় একটি ফিল্টার যুক্ত করি:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n%100>=20)+($n==0))*10 + $n%10) ));
সুবিধার্থে কোনও ফাংশনে কেবল এটি মুড়িয়ে রাখুন এবং আপনি চলে যাবেন!
এখানে একটি ওয়ান-লাইনার:
$a = <yournumber>;
echo $a.substr(date('jS', mktime(0,0,0,1,($a%10==0?9:($a%100>20?$a%10:$a%100)),2000)),-2);
সম্ভবত সবচেয়ে সংক্ষিপ্ত সমাধান। অবশ্যই একটি ফাংশন দ্বারা আবৃত করা যেতে পারে:
function ordinal($a) {
// return English ordinal number
return $a.substr(date('jS', mktime(0,0,0,1,($a%10==0?9:($a%100>20?$a%10:$a%100)),2000)),-2);
}
শুভেচ্ছা, পল
EDIT1: 11 এর মাধ্যমে 13 এর কোড সংশোধন।
EDIT2: 111, 211, এর জন্য কোড সংশোধন ...
সম্পাদনা 3: এখন এটি 10 এর গুণকগুলির জন্যও সঠিকভাবে কাজ করে।
http://www.phpro.org/example/Ordinal-Suffix.html থেকে
<?php
/**
*
* @return number with ordinal suffix
*
* @param int $number
*
* @param int $ss Turn super script on/off
*
* @return string
*
*/
function ordinalSuffix($number, $ss=0)
{
/*** check for 11, 12, 13 ***/
if ($number % 100 > 10 && $number %100 < 14)
{
$os = 'th';
}
/*** check if number is zero ***/
elseif($number == 0)
{
$os = '';
}
else
{
/*** get the last digit ***/
$last = substr($number, -1, 1);
switch($last)
{
case "1":
$os = 'st';
break;
case "2":
$os = 'nd';
break;
case "3":
$os = 'rd';
break;
default:
$os = 'th';
}
}
/*** add super script ***/
$os = $ss==0 ? $os : '<sup>'.$os.'</sup>';
/*** return ***/
return $number.$os;
}
?>
সহজ এবং সহজ উত্তর হবে:
$Day = 3;
echo date("S", mktime(0, 0, 0, 0, $Day, 0));
//OUTPUT - rd
আমি এই পিএইচপি 4 জন্য লিখেছি। এটি ঠিকঠাকভাবে কাজ করছে এবং এটি বেশ অর্থনৈতিক।
function getOrdinalSuffix($number) {
$number = abs($number) % 100;
$lastChar = substr($number, -1, 1);
switch ($lastChar) {
case '1' : return ($number == '11') ? 'th' : 'st';
case '2' : return ($number == '12') ? 'th' : 'nd';
case '3' : return ($number == '13') ? 'th' : 'rd';
}
return 'th';
}
আপনার কেবলমাত্র প্রদত্ত ফাংশন প্রয়োগ করতে হবে।
function addOrdinalNumberSuffix($num) {
if (!in_array(($num % 100),array(11,12,13))){
switch ($num % 10) {
// Handle 1st, 2nd, 3rd
case 1: return $num.'st';
case 2: return $num.'nd';
case 3: return $num.'rd';
}
}
return $num.'th';
}
সাধারণভাবে, আপনি এটি ব্যবহার করতে পারেন এবং ইকো get_placing_string (100) কল করতে পারেন ;
<?php
function get_placing_string($placing){
$i=intval($placing%10);
$place=substr($placing,-2); //For 11,12,13 places
if($i==1 && $place!='11'){
return $placing.'st';
}
else if($i==2 && $place!='12'){
return $placing.'nd';
}
else if($i==3 && $place!='13'){
return $placing.'rd';
}
return $placing.'th';
}
?>
আমি এমন একটি ফাংশন তৈরি করেছি যা পিএইচপি এর date();ফাংশনটির উপর নির্ভর করে না কারণ এটি প্রয়োজনীয় নয়, তবে এটি কমপ্যাক্ট এবং যতটা সংক্ষিপ্ত হিসাবে আমি মনে করি বর্তমানে সম্ভব হিসাবে তৈরি করেছি।
কোড : (মোট 121 বাইট)
function ordinal($i) { // PHP 5.2 and later
return($i.(($j=abs($i)%100)>10&&$j<14?'th':(($j%=10)>0&&$j<4?['st', 'nd', 'rd'][$j-1]:'th')));
}
আরও কমপ্যাক্ট কোড নীচে।
এটি নিম্নলিখিত হিসাবে কাজ করে :
printf("The %s hour.\n", ordinal(0)); // The 0th hour.
printf("The %s ossicle.\n", ordinal(1)); // The 1st ossicle.
printf("The %s cat.\n", ordinal(12)); // The 12th cat.
printf("The %s item.\n", ordinal(-23)); // The -23rd item.
এই ফাংশন সম্পর্কে জানতে স্টাফ :
floor($i), round($i)অথবা ceil($i)চূড়ান্ত প্রত্যাবর্তন বিবৃতি শুরুতে)।format_number($i)কমা-বিচ্ছিন্ন পূর্ণসংখ্যার জন্য আপনি চূড়ান্ত রিটার্ন স্টেটমেন্টের শুরুতে যোগ করতে পারেন (আপনি যদি হাজার, মিলিয়ন ইত্যাদি প্রদর্শন করছেন)।$iযদি কেবল ইনপুট না দিয়ে কেবল অর্ডিনাল প্রত্যয়টি ফিরিয়ে দিতে চান তবে আপনি কেবল বিবরণী শুরুর শুরু থেকে সরিয়ে ফেলতে পারেন।এই ফাংশনটি পিএইচপি 5.2 নভেম্বর 2006 সালে প্রকাশিত বিশুদ্ধভাবে সংক্ষিপ্ত অ্যারে সিনট্যাক্সের কারণে কাজ করে। এর আগে যদি আপনার কোনও সংস্করণ থাকে তবে দয়া করে আপগ্রেড করুন কারণ আপনি প্রায় এক দশক পেরিয়ে গেছেন! এটি ব্যর্থ হয়ে, কেবলমাত্র ['st', 'nd', 'rd']অস্থায়ী পরিবর্তনশীল ধারণকারী ইন-লাইনটি প্রতিস্থাপন করুন array('st', 'nd', 'rd');।
একই ফাংশন (ইনপুটটি ফিরিয়ে না দিয়ে), তবে আরও ভাল বোঝার জন্য আমার সংক্ষিপ্ত ফাংশনটির একটি বিস্ফোরিত দৃশ্য:
function ordinal($i) {
$j = abs($i); // make negatives into positives
$j = $j%100; // modulo 100; deal only with ones and tens; 0 through 99
if($j>10 && $j<14) // if $j is over 10, but below 14 (so we deal with 11 to 13)
return('th'); // always return 'th' for 11th, 13th, 62912th, etc.
$j = $j%10; // modulo 10; deal only with ones; 0 through 9
if($j==1) // 1st, 21st, 31st, 971st
return('st');
if($j==2) // 2nd, 22nd, 32nd, 582nd
return('nd'); //
if($j==3) // 3rd, 23rd, 33rd, 253rd
return('rd');
return('th'); // everything else will suffixed with 'th' including 0th
}
কোড আপডেট :
এখানে একটি সংশোধিত সংস্করণ যা 14 টি পুরো বাইট সংক্ষিপ্ত (107 বাইট মোট):
function ordinal($i) {
return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');
}
বা যতটা সম্ভব সংক্ষিপ্তভাবে 25 বাইট সংক্ষিপ্ত হওয়া (মোট 96 বাইট):
function o($i){return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');}
এই শেষ ফাংশনটির সাথে, কেবল কল করুন o(121);এবং এটি আমার তালিকাভুক্ত অন্যান্য ফাংশনগুলির মতো ঠিক একই কাজ করবে।
কোড আপডেট # 2 :
বেন এবং আমি একসাথে কাজ করেছি এবং এটিকে 38 বাইট (মোট 83 বাইট) কমিয়েছি:
function o($i){return$i.@(($j=abs($i)%100)>10&&$j<14?th:[th,st,nd,rd][$j%10]?:th);}
আমরা মনে করি না এটি সম্ভবত এর চেয়ে আরও ছোট হতে পারে! ভুল প্রমাণিত হতে ইচ্ছুক। :)
আশা করি আপনারা সবাই উপভোগ করবেন।
abs()মডুলাস ব্যবহার করতে হবে না%
abs();আমার যা প্রয়োজন তা নেতিবাচক চিহ্নটি সরিয়ে দেয়।
এমকেটাইম () ব্যবহারের পরিবর্তে এবং পিসিএল ইন্টেলের প্রয়োজন নেই পরিবর্তে মাসে (31 পর্যন্ত) তারিখের জন্য একটি ছোট সংক্ষিপ্ত সংস্করণ:
function ordinal($n) {
return (new DateTime('Jan '.$n))->format('jS');
}
বা পদ্ধতিগতভাবে:
echo date_format(date_create('Jan '.$n), 'jS');
এটি অবশ্যই কাজ করে কারণ আমি যে ডিফল্ট মাসটি বেছে নিয়েছিলাম (জানুয়ারী) -এর 31 দিন রয়েছে।
আকর্ষণীয়ভাবে যথেষ্ট যদি আপনি ফেব্রুয়ারী দিয়ে চেষ্টা করেন (বা 31 মাস ছাড়া অন্য এক মাস), এটি শেষ হওয়ার আগেই পুনরায় আরম্ভ হবে:
...clip...
31st
1st
2nd
3rd
সুতরাং আপনি tআপনার লুপের তারিখ নির্দিষ্টকারীর সাথে এই মাসের দিনগুলি গণনা করতে পারেন : মাসে দিনের সংখ্যা।
পিএইচপি.নেটে একটি উত্তর পেয়েছে
<?php
function ordinal($num)
{
// Special case "teenth"
if ( ($num / 10) % 10 != 1 )
{
// Handle 1st, 2nd, 3rd
switch( $num % 10 )
{
case 1: return $num . 'st';
case 2: return $num . 'nd';
case 3: return $num . 'rd';
}
}
// Everything else is "nth"
return $num . 'th';
}
?>
তারিখ ফাংশনগুলি ব্যবহার করে এখানে আরও একটি খুব সংক্ষিপ্ত সংস্করণ দেওয়া আছে। এটি যে কোনও সংখ্যার জন্য (মাসের দিনগুলিতে সীমাবদ্ধ নয়) কাজ করে এবং একাদশ বিবেচনা করে যে * ১১ তম * দ্বাদশ * ১৩ তম * ১ ম * ২ য় * তৃতীয় বিন্যাস অনুসরণ করে না।
function getOrdinal($n)
{
return $n . date_format(date_create('Jan ' . ($n % 100 < 20 ? $n % 20 : $n % 10)), 'S');
}
আমি এই ছোট স্নিপেট পছন্দ
<?php
function addOrdinalNumberSuffix($num) {
if (!in_array(($num % 100),array(11,12,13))){
switch ($num % 10) {
// Handle 1st, 2nd, 3rd
case 1: return $num.'st';
case 2: return $num.'nd';
case 3: return $num.'rd';
}
}
return $num.'th';
}
?>