मैं निम्नानुसार संख्याएँ प्रदर्शित करना चाहता हूँ
- 1 के रूप में 1,
- 2 के रूप में 2,
- ...,
- 150 के रूप में 150।
मुझे अपने कोड में प्रत्येक संख्या के लिए सही क्रमिक प्रत्यय (st, nd, rd या th) कैसे पता लगाना चाहिए?
मैं निम्नानुसार संख्याएँ प्रदर्शित करना चाहता हूँ
मुझे अपने कोड में प्रत्येक संख्या के लिए सही क्रमिक प्रत्यय (st, nd, rd या th) कैसे पता लगाना चाहिए?
जवाबों:
$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;
PHP में इसके लिए अंतर्निहित कार्यक्षमता है । यह अंतर्राष्ट्रीयकरण को भी संभालता है!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
ध्यान दें कि यह कार्यक्षमता केवल PHP 5.3.0 और बाद में उपलब्ध है।
NumberFomatter file not found
। आपने इसके आसपास कैसे काम किया?
apt-get install php5-intl
यह 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
) के लिए सीमा से बाहर के मूल्यों पर इनायत करने में विफल रहता है, लेकिन हम $n
6 पर कैप करने के लिए कुछ सरल इनलाइन तर्क जोड़ सकते हैं :
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) ));
बस इसे सुविधा के लिए एक समारोह में लपेटो और तुम जाओ!
यहाँ एक लाइनर है:
$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 के गुणकों के लिए भी सही ढंग से काम करता है।
से 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;
}
?>
सरल और आसान उत्तर होगा:
$Day = 3;
echo date("S", mktime(0, 0, 0, 0, $Day, 0));
//OUTPUT - rd
मैंने इसे 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';
}
आपको बस दिए गए फ़ंक्शन को लागू करने की आवश्यकता है।
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';
}
?>
मैंने एक ऐसा फंक्शन बनाया है जो 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()
मापांक%
abs();
नकारात्मक संकेत को हटा देता है जो मुझे चाहिए था।
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
अपने लूप में तारीख निर्दिष्ट तिथि के साथ गिन सकते हैं : महीने में दिनों की संख्या।
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';
}
?>
यहां दिनांक कार्यों का उपयोग करते हुए एक और बहुत छोटा संस्करण है। यह किसी भी संख्या के लिए काम करता है (महीने के दिनों तक विवश नहीं) और यह ध्यान रखता है कि * 11 वीं * 12 वीं * 13 वीं * 1 * 2 * 3 डी प्रारूप का पालन नहीं करता है।
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';
}
?>