我希望以以下方式显示数字
- 将1显示为1st,
- 将2显示为2nd,
- ......
- 将150显示为150th。
在我的代码中,如何找到每个数字的正确序数后缀(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;
。 - Gavin JacksonPHP内置此功能,甚至支持国际化!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
请注意,此功能仅适用于PHP 5.3.0及更高版本。
NumberFomatter文件未找到
。你是如何解决这个问题的? - jhnferrarisapt-get install php5-intl
- Aley通过利用PHP内置的日期/时间函数中类似的功能,可以在一行代码中完成此操作。我谦虚地提交如下:
解决方案:
function ordinalSuffix( $n )
{
return date('S',mktime(1,1,1,1,( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
}
详细解释:
内置的date()
函数具有处理每月第n天计算的后缀逻辑。当在格式字符串中给定S
时,返回该后缀:
date( 'S' , ? );
由于date()
要求时间戳(在上面的?
处),因此我们将整数$n
作为day
参数传递给mktime()
,并使用1
作为hour
,minute
,second
和month
的虚拟值:
date( 'S' , mktime( 1 , 1 , 1 , 1 , $n ) );
这实际上可以优雅地处理超出月份范围(即 $n > 31
)的值,但我们可以添加一些简单的内联逻辑来将 $n
限制在 29 天以内:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20))*10 + $n%10) ));
唯一的正值(2017年5月)无法实现的是$n == 0
,但在这种特殊情况下,只需添加10即可轻松解决:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
更新,2017年5月
正如@donatJ所观察到的那样,上述代码在超过100(例如"111st")时会失败,因为>=20
的检查总是返回true。为了每个世纪重置这些值,我们向比较添加了一个过滤器:
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);
}
问候,保罗
编辑1:修正11到13的代码。
编辑2:修正111、211等代码。
编辑3:现在它也可以正确处理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';
}
$number
变量中。然后它获取最后一位数字,并将其放入$lastChar
中。由于大多数情况下需要在末尾加上“th”,因此它只关注特殊情况:以1、2或3结尾的数字。在每种情况下,该函数寻找例外情况(11、12和13)以在这些情况下返回“th”,或者对于其他所有情况返回“st”、“nd”或“rd”。我个人认为这个函数是最好的。 - Stevish这是正确的解决方案。
$numberFormatter = new NumberFormatter('en_US', NumberFormatter::ORDINAL);
echo $numberFormatter->format(11);
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';
}
通常情况下,您可以使用以下代码并调用 echo 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';
}
?>