为了账号安全,请及时绑定邮箱和手机立即绑定

在PHP中显示带序数后缀的数字

/ 猿问

在PHP中显示带序数后缀的数字

PHP
MMTTMM 2019-10-15 15:35:06

我想显示数字如下


1为1,

2作为第二,

...,

150至150。

如何为代码中的每个数字找到正确的序数后缀(st,nd,rd或th)?


查看完整描述

3 回答

?
慕的地8271018

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


查看完整回答
反对 回复 2019-10-15
?
萧十郎

PHP为此提供了内置功能。它甚至可以处理国际化!


$locale = 'en_US';

$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);

echo $nf->format($number);

请注意,此功能仅在PHP 5.3.0及更高版本中可用。


查看完整回答
反对 回复 2019-10-15
?
一只甜甜圈

通过利用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所观察到的那样,由于>=20检查始终返回true ,因此上述结果在100以上(例如“ 111st”)失败。要在每个世纪重置这些值,我们在比较中添加一个过滤器:


date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n%100>=20)+($n==0))*10 + $n%10) ));

只需将其包装在一个函数中即可,以方便使用!


查看完整回答
反对 回复 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信