[php] PHP에서 서 수가 붙은 숫자 표시

다음과 같이 숫자를 표시하고 싶습니다

  • 1을 1로,
  • 2를 2로,
  • …,
  • 150은 150입니다.

코드에서 각 숫자의 올바른 서수 (st, nd, rd 또는 th)를 어떻게 찾습니까?



답변

Wikipedia에서 :

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


답변

PHP에는이 기능이 내장되어 있습니다 . 국제화도 처리합니다!

$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);

이 기능은 PHP 5.3.0 이상에서만 사용할 수 있습니다.


답변

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는 AS day에 대한 매개 변수 mktime()의 값 더미 및 사용 1에 대한 hour, minute, second, 및 month:

date( 'S' , mktime( 1 , 1 , 1 , 1 , $n ) );

이것은 실제로 달의 범위를 벗어난 값 (예 :)에서 정상적으로 실패 $n > 31하지만 $n29 에서 캡 을 하기 위해 간단한 인라인 논리를 추가 할 수 있습니다 .

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검사가 항상 참을 반환하기 때문에 위의 100 이상 (예 : “111st”)에 실패 합니다. 모든 세기를 재설정하기 위해 비교에 필터를 추가합니다.

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

감사합니다, 폴

EDIT1 : 11에서 13까지의 코드 수정.

EDIT2 : 111, 211, …에 대한 코드 수정

EDIT3 : 이제 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';
}