PHP में क्रमिक प्रत्यय के साथ संख्याएँ प्रदर्शित करें


149

मैं निम्नानुसार संख्याएँ प्रदर्शित करना चाहता हूँ

  • 1 के रूप में 1,
  • 2 के रूप में 2,
  • ...,
  • 150 के रूप में 150।

मुझे अपने कोड में प्रत्येक संख्या के लिए सही क्रमिक प्रत्यय (st, nd, rd या th) कैसे पता लगाना चाहिए?


2
मेरा जवाब यहां देखें। stackoverflow.com/questions/69262/… यह प्रश्न .NET के लिए था, लेकिन मैंने PHP समाधान के साथ उत्तर दिया, इसलिए इसे बाहर निकालने में मदद करनी चाहिए।
12

जिस तरह से मैं ऐसा करने के बारे में सोच सकता हूं वह एक ऐसा बयान है जो आपके लिए संभव होने वाले प्रत्येक नंबर के लिए हो रहा है, IE, यदि (1) तो "सेंट" अन्य (2) तो "एनडी" आदि आदि यदि (23000) तो " nd "। यदि आपके पास बड़ी संख्या है तो यह एक समस्या है, लेकिन आप अपने लिए कोड लिखने के लिए एक प्रोग्राम लिख सकते हैं, यह आपके कोड में कॉपी पेस्ट करने के लिए आपके लिए ifs को प्रिंट करने वाले सभी नंबरों को लूप कर सकता है।
टॉम गुलेन

2
@Tom, लुकअप टेबल बेहतर हो सकती है, बस इसे 23000 मान के साथ इनिशियलाइज़ करें और इंडेक्स n पर वैल्यू प्राप्त करें, जहाँ n वह संख्या है जो आप ऑर्डिनल चाहते हैं।
जॉन बोकर

2
कर्नल। आप शानदार हो सकते हैं लेकिन सभी नहीं। किसी भी तरह से मेरे सवाल पर दिलचस्पी दिखाने के लिए धन्यवाद
ArK

@ जॉन, बहुत ही चालाक विचार है, यह बहुत जल्दी पहुंच जाएगा और साथ ही प्रत्येक सूचकांक उस संख्या का प्रतिनिधित्व करता है जिसे आप देख रहे हैं।
टॉम गुलेन

जवाबों:


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
@GavinJackson इस उत्कृष्ट समाधान के लिए आपके अतिरिक्त ने वास्तव में मेरी मदद की (+1)। क्या आप मुझे समझा सकते हैं कि गणना में क्या हो रहा है? मैं समझना चाहता हूँ। चीयर्स! EDIT: एक उत्तर मिला: सशर्त ऑपरेटर
एंड्रयू फॉक्स

क्षमा करें, 111 वोटों को तोड़ना था 112: डी ने इसे एक डेमो ऐप के साथ डेल्फी में एक समारोह बनाया: pastebin.com/wvmz1CHY
जैरी डॉज

1
@HafezDivandari - क्या आप सुनिश्चित हैं? बस 7.1.19 के साथ परीक्षण किया गया और ठीक काम करने लगता है
Iacopo

142

PHP में इसके लिए अंतर्निहित कार्यक्षमता है । यह अंतर्राष्ट्रीयकरण को भी संभालता है!

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

ध्यान दें कि यह कार्यक्षमता केवल PHP 5.3.0 और बाद में उपलब्ध है।


15
ध्यान दें कि इसके लिए PECL intl = = 1.0.0
rymo

4
क्या आप जानते हैं कि शब्द रूप में क्रमिक संख्या प्राप्त करना संभव है? 1, 2, 3 ... के बजाय पहला, दूसरा, तीसरा इत्यादि ...
19_13 को 19_13

@jeremy जब मैंने नंबरफार्मेट का उपयोग करने का प्रयास किया, तो यह हमेशा एक त्रुटि फेंकता है NumberFomatter file not found। आपने इसके आसपास कैसे काम किया?
झंफरारिस

1
आप एक्सटेंशन इंस्टॉल है @Jhnapt-get install php5-intl
Aley

@ मैं देख रहा हूँ Yii में एक अंतर्निहित फ़ॉर्मेटर है जिसका हम अभी उपयोग कर रहे हैं। हेह
झंवरारिस

20

यह PHP की अंतर्निहित तिथि / समय के कार्यों में समान कार्यक्षमता का लाभ उठाकर एक ही पंक्ति में पूरा किया जा सकता है। मैं विनम्रतापूर्वक प्रस्तुत करता हूं:

उपाय:

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) के लिए सीमा से बाहर के मूल्यों पर इनायत करने में विफल रहता है, लेकिन हम $n6 पर कैप करने के लिए कुछ सरल इनलाइन तर्क जोड़ सकते हैं :

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

अपडेट, मई २०१ May

जैसा कि @donatJ द्वारा देखा गया है, उपरोक्त 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: 13 के माध्यम से 11 के लिए कोड का सुधार।

EDIT2: 111, 211, के लिए कोड का सुधार ...

EDIT3: अब यह 10 के गुणकों के लिए भी सही ढंग से काम करता है।


मुझे यह दृष्टिकोण पसंद है, लेकिन अफसोस, यह काम नहीं करता है :-( 30 वें 30 वें के रूप में बाहर आता है। 40 वें स्थान पर 40 वें स्थान पर आता है। आदि
Flukey

1
हाँ क्षमा करें। जब मैंने सोचा था कि प्रश्न को पढ़ता हूं, तो यह कोड की एक पंक्ति द्वारा संभव होना चाहिए। और मैंने इसे दूर टाइप किया। जैसा कि आप मेरे संपादन से देखते हैं, मैं सुधार कर रहा हूं। तीसरे संपादन के बाद अब मुझे लगता है कि यह काफी हो चुका है। 1 से 150 तक कम से कम सभी नंबर मेरी स्क्रीन पर अच्छी तरह से प्रिंट होते हैं।
पॉल

500 तक अच्छा लग रहा है! (इससे आगे इसका परीक्षण नहीं किया है)। अच्छा कार्य! :-)
फ्लुकी

13

से http://www.phpro.org/examples/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

मैंने इसे PHP4 के लिए लिखा था। यह ठीक काम कर रहा है और यह काफी किफायती है।

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

विशाल कुमार, क्या आप विस्तार / विस्तार / समझा सकते हैं कि थोड़ा और अधिक? टी.के.एस!
--लिट्रेस

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

मैंने एक ऐसा फंक्शन बनाया है जो PHP के 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रिटर्न स्टेटमेंट की शुरुआत से हटा सकते हैं यदि आप केवल इनपुट के बिना ही ऑर्डिनल प्रत्यय वापस करना चाहते हैं।

यह फ़ंक्शन लघु सरणी सिंटैक्स की वजह से नवंबर 2006 में जारी PHP 5.2 को शुरू करने का काम करता है। यदि आपके पास इससे पहले एक संस्करण है, तो कृपया अपग्रेड करें क्योंकि आप लगभग एक दशक पुराने हैं! ऐसा करने में, बस ['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 समस्या के

केवल मोडुलो पर भरोसा करना अभी भी नकारात्मक संकेत छोड़ देगा। abs();नकारात्मक संकेत को हटा देता है जो मुझे चाहिए था।
nxasdf

1

Mktime () का उपयोग करने के बजाय महीने में (31 तक) के लिए एक छोटा संस्करण भी है और pecl इंट्रस्ट की आवश्यकता नहीं है:

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.net में उत्तर मिला

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

यहां दिनांक कार्यों का उपयोग करते हुए एक और बहुत छोटा संस्करण है। यह किसी भी संख्या के लिए काम करता है (महीने के दिनों तक विवश नहीं) और यह ध्यान रखता है कि * 11 वीं * 12 वीं * 13 वीं * 1 * 2 * 3 डी प्रारूप का पालन नहीं करता है।

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
मुझे यह निश्चित नहीं है कि चिंतनथुमार के उत्तर के अलावा यह उत्तर क्या प्रदान करता है। खैर, यह संकेत देता है कि चिंतनतुममार ने कॉपीराइट उल्लंघन किया, जब तक कि उन्होंने आपके स्रोत पर कोड नहीं लिखा ...
एंड्रियास रिब्रांडैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.