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

ArK*_*ArK 139 php numbers

我想显示如下数字

  • 1作为第1,
  • 2作为第2,
  • ...
  • 150为150.

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)

  • 我喜欢你的解决方案.另外如果你不想生成**0****修改最后一行是`$ abbreviation =($ number)?$号.$ ends [$ number%10]:$ number;` (5认同)

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及更高版本.

  • 请注意,这也需要PECL intl> = 1.0.0 (14认同)
  • 你知道是否有可能以单词形式获得序数?即第一,第二,第三等,而不是第一,第二,第三...... (3认同)

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()和使用的虚值1hour,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)


ile*_*ras 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';  
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这已经晚了,但是要回答@iletras,这个函数首先获取数字的 mod 100(除以 100,返回余数,这有效地删除了数百个位置中的所有内容),并将其放入 `$数字`变量。然后它获取最后一位数字并将其放入“$lastChar”中。由于大多数情况都需要在末尾添加“th”,因此他只关注特殊情况:以 1、2 或 3 结尾的数字。在每种情况下,此函数都会查找异常(11、12 和 13)以返回 '在这些情况下为 th',或者在所有其他情况下为 'st'、'nd' 或 'rd'。我个人最喜欢这个。 (2认同)

Whi*_*rse 7

简单易行的答案将是:

$Day = 3; 
echo date("S", mktime(0, 0, 0, 0, $Day, 0));

//OUTPUT - rd
Run Code Online (Sandbox Code Playgroud)