Отображать числа с порядковым суффиксом в PHP - PullRequest
132 голосов
/ 24 июня 2010

Я хочу отображать числа следующим образом

  • 1 как 1-й,
  • 2 как 2-й,
  • ...,
  • 150как 150th.

Как мне найти правильный порядковый суффикс (st, nd, rd или th) для каждого числа в моем коде?

Ответы [ 15 ]

1 голос
/ 17 января 2018
function ordinal($number){

    $last=substr($number,-1);
    if( $last>3 || $last==0 || ( $number >= 11 && $number <= 19 ) ){
      $ext='th';
    }else if( $last==3 ){
      $ext='rd';
    }else if( $last==2 ){
      $ext='nd';
    }else{
      $ext='st';
    }
    return $number.$ext;
  }
1 голос
/ 27 ноября 2015

Еще более короткая версия для дат в месяце (до 31) вместо использования mktime () и не требующая pecl intl:

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 в цикле: количество дней в месяце.

0 голосов
/ 07 июля 2018

Вот еще одна очень короткая версия с использованием функций даты.Он работает для любого числа (без ограничений по дням месяца) и учитывает, что * 11 * 12 * 13 не соответствует формату * 1 * 2 * 3 *.

function getOrdinal($n)
{
    return $n . date_format(date_create('Jan ' . ($n % 100 < 20 ? $n % 20 : $n % 10)), 'S');
}
0 голосов
/ 21 сентября 2015

Нашел ответ в 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';
}
?>
0 голосов
/ 25 марта 2014

Мне нравится этот небольшой фрагмент

<?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';
  }

?>

ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...