পিএইচপি-তে অর্ডিনাল প্রত্যয় সহ সংখ্যাগুলি প্রদর্শন করুন


149

আমি নিম্নলিখিত হিসাবে সংখ্যা প্রদর্শন করতে চান

  • 1 ম হিসাবে 1,
  • ২ য় হিসাবে,
  • ...,
  • 150 হিসাবে 150 তম।

আমার কোডে প্রতিটি সংখ্যার জন্য সঠিক অর্ডিনাল প্রত্যয় (সেন্ট, এনডি, আরডি বা থাই) কীভাবে খুঁজে পাব?


2
আমার উত্তর এখানে দেখুন। stackoverflow.com/questions/69262/… এই প্রশ্নটি। নেট জন্য ছিল, কিন্তু আমি একটি পিএইচপি সমাধান দিয়ে উত্তর দিয়েছি, সুতরাং এটি আপনাকে সহায়তা করা উচিত।
নিকফ

আমি এটি করার একমাত্র উপায়টি হ'ল যদি সম্ভব প্রতিটি সংখ্যার জন্য যদি বিবৃতি উঠে আসে, যেমন, (1) তারপর "স্ট্যান্ড" অন্যটিফ (2) তারপর "এনডি" ইত্যাদি ইত্যাদি যদি (23000) থাকে তবে " য় "। আপনার যদি বড় সংখ্যা থাকে তবে এটি একটি সমস্যা তবে আপনার জন্য কোড লিখতে একটি প্রোগ্রাম লিখতে পারে, এটি আপনার কোডটিতে কপি + পেস্ট করার জন্য আইএফএস প্রিন্ট করা সমস্ত নম্বর লুপ করতে পারে।
টম গ্লেন

2
@ টম, একটি সন্ধানের টেবিলটি আরও ভাল হতে পারে, কেবল এটি 23000 মান দিয়ে শুরু করুন এবং সূচি n এ মানটি পাবেন, যেখানে এনটি অর্ডিনাল চান এমন নম্বর is
জন বোকার

2
কর্নেল শ্র্যাপেল। আপনি উজ্জ্বল হতে পারে কিন্তু সব না। আমার প্রশ্নের প্রতি আগ্রহ দেখানোর জন্য যে কোনও উপায়ে ধন্যবাদ
আরকে

@ জন, খুব চতুর ধারণা, এটি অ্যাক্সেস করা খুব দ্রুত হবে পাশাপাশি প্রতিটি সূচি আপনি যে সংখ্যাটি দেখছেন তাতে প্রতিনিধিত্ব করে।
টম গ্লেন

উত্তর:


283

উইকিপিডিয়া থেকে :

$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);

যদিও প্রথমে কিছুটা বুঝতে অসুবিধা হয়েছে, এখন আমার মনে হয় যে এটি অর্ডিনাল প্রত্যয় সিস্টেমটি ইংরাজির জন্য কীভাবে কাজ করে তা উপস্থাপন করে।
এরিস্কো

6
আমি আপনার সমাধান পছন্দ। অতিরিক্ত হিসাবে যদি আপনি 0 তম জেনার পছন্দ না করে শেষ লাইনে পরিবর্তন করুন$abbreviation = ($number)? $number. $ends[$number % 10] : $number;
গ্যাভিন জ্যাকসন

1
@ গ্যাভিন জ্যাকসন এই দুর্দান্ত সমাধানটিতে আপনার যোগ যোগ করে আমাকে সত্যিই সাহায্য করেছে (+1)। আপনি দয়া করে আমাকে হিসাবের মধ্যে কি চলছে তা ব্যাখ্যা করতে পারেন? আমি বুঝতে চাই. চিয়ার্স! সম্পাদনা: একটি উত্তর
অ্যান্ড্রু ফক্স

দুঃখিত, 111 টি 112 টি ভোট ভঙ্গ করতে হয়েছিল: ডি একটি ডেমো অ্যাপ্লিকেশন সহ এটি ডেলফিতে একটি ফাংশন তৈরি করেছে: পেস্টবিন.com
জেরি ডজ

1
@ হাফেজ দিওয়ানদারি - আপনি কি নিশ্চিত? সবেমাত্র 7.1.19 দিয়ে পরীক্ষা করা হয়েছে এবং এটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে
Iacopo

142

পিএইচপি এর জন্য বিল্ট-ইন কার্যকারিতা রয়েছে । এমনকি আন্তর্জাতিকীকরণও পরিচালনা করে!

$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);

মনে রাখবেন যে এই কার্যকারিতাটি কেবলমাত্র পিএইচপি 5.3.0 এবং তার পরে পাওয়া যাবে।


15
নোট করুন এটির জন্য
পিইসিএল ইন্টেল

4
আপনি কি জানেন কী শব্দ আকারে অর্ডিনাল নম্বর পাওয়া সম্ভব? অর্থাত্ প্রথম, দ্বিতীয়, তৃতীয়, ইত্যাদি 1 ম, দ্বিতীয়, তৃতীয় ... এর পরিবর্তে ...
এর_ম

@ জেরেমি যখন আমি নাম্বার ফর্ম্যাটার ব্যবহার করার চেষ্টা করেছি তখন এটি সর্বদা একটি ত্রুটি ফেলে দেয় NumberFomatter file not found। আপনি এই চারপাশে কাজ কিভাবে?
jhnferraris

1
@ জেএনএইচএন আপনাকে এক্সটেনশনটি ইনস্টল করতে হবেapt-get install php5-intl
এলে

@ অ্যালি আমি দেখছি Yii এর একটি অন্তর্নির্মিত ফর্ম্যাটার রয়েছে যা আমরা এখনই ব্যবহার করছি। হেহ
jhnferraris

20

পিএইচপি-র অন্তর্নির্মিত তারিখ / সময় ফাংশনগুলিতে অনুরূপ কার্যকারিতা উপকারের মাধ্যমে এটি একক লাইনে সম্পাদন করা যায়। আমি বিনীতভাবে জমা দিন:

সমাধান:

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) ));

সুবিধার্থে কোনও ফাংশনে কেবল এটি মুড়িয়ে রাখুন এবং আপনি চলে যাবেন!


14

এখানে একটি ওয়ান-লাইনার:

$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 ​​এর গুণকগুলির জন্যও সঠিকভাবে কাজ করে।


আমি এই পদ্ধতিটি পছন্দ করি, তবে হায়, এটি কার্যকর হয় না :-( 30 তম 30 তারিখে প্রকাশিত হয় 40 তম 40 তম হিসাবে আসে as ইত্যাদি
ফ্লুকি

1
হ্যাঁ, দুঃখিত। আমি যখন ভেবেছিলাম এমন প্রশ্নটি পড়ি, আরে কোডের একক লাইন দ্বারা এটি সম্ভব হওয়া উচিত। এবং আমি কেবল এটি টাইপ করেছি। আপনি আমার সম্পাদনাগুলি থেকে দেখুন, আমি উন্নতি করছি। তৃতীয় সম্পাদনার পরে এখন আমি মনে করি এটি বেশ সম্পন্ন হয়েছে। কমপক্ষে 1 থেকে 150 পর্যন্ত সমস্ত সংখ্যা আমার স্ক্রিনে দুর্দান্তভাবে মুদ্রণ করে।
পল

500 অবধি ভাল লাগছে! (এর চেয়ে আরও আগে এটি পরীক্ষা করা হয়নি)। ভাল কাজ! :-)
ফ্লুকি

13

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;
}
?> 

9

সহজ এবং সহজ উত্তর হবে:

$Day = 3; 
echo date("S", mktime(0, 0, 0, 0, $Day, 0));

//OUTPUT - rd

প্রশ্নটিতে খেজুর সম্পর্কে কিছু বলতে চান না। আমি যেভাবেই হোক উন্নত করেছিলাম - এটির একটি দ্রুত এবং সহজ সমাধান যখন আপনি জানেন যে নম্বর সীমাটি হতে চলেছে <32
ক্রোনোকলি

8

আমি এই পিএইচপি 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';  
}

বিশাল কুমার, আপনি কি আরও কিছুটা প্রসার / বিস্তৃত / ব্যাখ্যা করতে পারবেন? Tks!
ইলিট্রেস

4

আপনার কেবলমাত্র প্রদত্ত ফাংশন প্রয়োগ করতে হবে।

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';
}

3

সাধারণভাবে, আপনি এটি ব্যবহার করতে পারেন এবং ইকো 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';
}
?>

2

আমি এমন একটি ফাংশন তৈরি করেছি যা পিএইচপি এর 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.

এই ফাংশন সম্পর্কে জানতে স্টাফ :

  • এটি ধনাত্মক পূর্ণসংখ্যার সমান negativeণাত্মক পূর্ণসংখ্যার সাথে ডিল করে এবং চিহ্নটি রাখে।
  • প্রত্যাশিত হিসাবে পনেরটি সংখ্যার জন্য এটি 11 তম, 12, 13, 811 তম, 812 তম, 813 তম ইত্যাদি প্রদান করে returns
  • এটা তোলে দশমিক পরীক্ষা যাবে না, তবে জায়গায় তাদের ছেড়ে চলে যেতে হবে (ব্যবহারের 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()মডুলাস ব্যবহার করতে হবে না%
99 সমস্যা - সিন্ট্যাক্স এক

শুধুমাত্র মডুলোর উপর নির্ভর করা এখনও theণাত্মক চিহ্ন রেখে যাবে। abs();আমার যা প্রয়োজন তা নেতিবাচক চিহ্নটি সরিয়ে দেয়।
nxasdf

1

এমকেটাইম () ব্যবহারের পরিবর্তে এবং পিসিএল ইন্টেলের প্রয়োজন নেই পরিবর্তে মাসে (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আপনার লুপের তারিখ নির্দিষ্টকারীর সাথে এই মাসের দিনগুলি গণনা করতে পারেন : মাসে দিনের সংখ্যা।


1
function ordinal($number){

    $last=substr($number,-1);
    if( $last>3 || $last==0 || ( $number >= 11 && $number <= 19 ) ){
      $ext='th';
    }else if( $last==3 ){
      $ext='rd';
    }else if( $last==2 ){
      $ext='nd';
    }else{
      $ext='st';
    }
    return $number.$ext;
  }

0

পিএইচপি.নেটে একটি উত্তর পেয়েছে

<?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';
}
?>

0

তারিখ ফাংশনগুলি ব্যবহার করে এখানে আরও একটি খুব সংক্ষিপ্ত সংস্করণ দেওয়া আছে। এটি যে কোনও সংখ্যার জন্য (মাসের দিনগুলিতে সীমাবদ্ধ নয়) কাজ করে এবং একাদশ বিবেচনা করে যে * ১১ তম * দ্বাদশ * ১৩ তম * ১ ম * ২ য় * তৃতীয় বিন্যাস অনুসরণ করে না।

function getOrdinal($n)
{
    return $n . date_format(date_create('Jan ' . ($n % 100 < 20 ? $n % 20 : $n % 10)), 'S');
}

-1

আমি এই ছোট স্নিপেট পছন্দ

<?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';
  }

?>

এখানে


1
চিন্তন্থুমারের উত্তর ছাড়াও এই উত্তর কী প্রস্তাব দেয় তা আমি নিশ্চিত নই। ঠিক আছে, এটি ইঙ্গিত দেয় যে চিন্তান তুম্মার একটি কপিরাইট লঙ্ঘন করেছেন, যদি না তিনি আপনার উত্সে কোডটি লিখে থাকেন ...
অ্যান্ড্রেস রেজব্রান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.