我想显示如下数字
How should I find the correct ordinal suffix (st, nd, rd or th) for each number in my code?
Iac*_*opo 273
$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];
Run Code Online (Sandbox Code Playgroud)
$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);
Run Code Online (Sandbox Code Playgroud)
Jer*_*man 133
PHP具有内置功能.它甚至处理国际化!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
Run Code Online (Sandbox Code Playgroud)
请注意,此功能仅适用于PHP 5.3.0及更高版本.
And*_*zak 20
这可以通过利用PHP内置日期/时间函数中的类似功能在一行中完成.我谦卑地提交:
解:
function ordinalSuffix( $n )
{
return date('S',mktime(1,1,1,1,( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
}
Run Code Online (Sandbox Code Playgroud)
详细说明:
内置date()函数具有后缀逻辑,用于处理第n天的计算.S格式字符串中给出后缀:
date( 'S' , ? );
Run Code Online (Sandbox Code Playgroud)
由于date()需要的时间戳(对于?以上),我们将通过我们的整数$n作为day参数mktime()和使用的虚值1的hour,minute,second,和month:
date( 'S' , mktime( 1 , 1 , 1 , 1 , $n ) );
Run Code Online (Sandbox Code Playgroud)
这实际上在一个月中的某一天(即$n > 31)中超出范围的值时优雅地失败但是我们可以添加一些简单的内联逻辑来限制$n在29:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20))*10 + $n%10) ));
Run Code Online (Sandbox Code Playgroud)
唯一的正面价值(2017年5月)这个失败了$n == 0,但是通过在特殊情况下添加10来轻松修复:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
Run Code Online (Sandbox Code Playgroud)
2017年5月更新
正如@donatJ所观察到的,上述失败超过100(例如"111st"),因为>=20检查总是返回true.为了在每个世纪重置这些,我们在比较中添加一个过滤器:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n%100>=20)+($n==0))*10 + $n%10) ));
Run Code Online (Sandbox Code Playgroud)
只需将其包装在功能中以方便使用即可!
Pau*_*aul 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);
Run Code Online (Sandbox Code Playgroud)
可能是最短的解决方案.当然可以用函数包装:
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);
}
Run Code Online (Sandbox Code Playgroud)
问候,保罗
EDIT1:修正11到13的代码.
EDIT2:修正111,211的代码......
EDIT3:现在它也适用于10的倍数.
Joh*_*ker 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;
}
?>
Run Code Online (Sandbox Code Playgroud)
我为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';
}
Run Code Online (Sandbox Code Playgroud)
简单易行的答案将是:
$Day = 3;
echo date("S", mktime(0, 0, 0, 0, $Day, 0));
//OUTPUT - rd
Run Code Online (Sandbox Code Playgroud)