다음과 같이 숫자를 표시하고 싶습니다
- 1을 1로,
- 2를 2로,
- ...,
- 150은 150입니다.
코드에서 각 숫자의 올바른 서수 (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;
PHP에는이 기능이 내장되어 있습니다 . 국제화도 처리합니다!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
이 기능은 PHP 5.3.0 이상에서만 사용할 수 있습니다.
NumberFomatter file not found
. 이 문제를 어떻게 해결 했습니까?
apt-get install php5-intl
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
하지만 $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
검사가 항상 참을 반환하기 때문에 위의 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;
}
?>
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';
}
일반적으로이를 사용하고 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';
}
?>
date();
필연적으로 PHP 기능 에 의존하지 않는 기능을 만들었지 만 현재 가능한 한 작고 짧게 만들었습니다.
코드 : (총 121 바이트)
function ordinal($i) { // PHP 5.2 and later
return($i.(($j=abs($i)%100)>10&&$j<14?'th':(($j%=10)>0&&$j<4?['st', 'nd', 'rd'][$j-1]:'th')));
}
아래의 더 작은 코드.
다음과 같이 작동합니다 .
printf("The %s hour.\n", ordinal(0)); // The 0th hour.
printf("The %s ossicle.\n", ordinal(1)); // The 1st ossicle.
printf("The %s cat.\n", ordinal(12)); // The 12th cat.
printf("The %s item.\n", ordinal(-23)); // The -23rd item.
이 기능에 대해 알아야 할 사항 :
floor($i)
, round($i)
또는 ceil($i)
최종 return 문의 시작 부분에).format_number($i)
최종 반환 문의 시작 부분에 쉼표로 구분 된 정수 (수천, 수백만 등을 표시하는 경우)를 얻기 위해 추가 할 수도 있습니다 .$i
입력 한 내용없이 서수 접미사 만 반환하려는 경우 return 문의 시작 부분에서를 제거 할 수 있습니다 .이 함수는 짧은 배열 구문 때문에 2006 년 11 월에 릴리스 된 PHP 5.2부터 시작합니다. 이전 버전이 있다면 거의 10 년이 지났으므로 업그레이드하십시오! 실패하면 인라인 ['st', 'nd', 'rd']
을 포함하는 임시 변수로 바꾸십시오 array('st', 'nd', 'rd');
.
동일한 함수 (입력을 반환하지 않고),하지만 더 나은 이해를 위해 내 짧은 함수의 분해도 :
function ordinal($i) {
$j = abs($i); // make negatives into positives
$j = $j%100; // modulo 100; deal only with ones and tens; 0 through 99
if($j>10 && $j<14) // if $j is over 10, but below 14 (so we deal with 11 to 13)
return('th'); // always return 'th' for 11th, 13th, 62912th, etc.
$j = $j%10; // modulo 10; deal only with ones; 0 through 9
if($j==1) // 1st, 21st, 31st, 971st
return('st');
if($j==2) // 2nd, 22nd, 32nd, 582nd
return('nd'); //
if($j==3) // 3rd, 23rd, 33rd, 253rd
return('rd');
return('th'); // everything else will suffixed with 'th' including 0th
}
코드 업데이트 :
다음은 14 바이트 전체가 더 짧은 수정 된 버전입니다 (총 107 바이트).
function ordinal($i) {
return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');
}
또는 가능한 짧은 25 바이트 (총 96 바이트) :
function o($i){return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');}
이 마지막 함수를 사용하면 간단히 호출하면 o(121);
나열된 다른 함수와 정확히 동일하게 수행됩니다.
코드 업데이트 # 2 :
Ben 과 나는 함께 작업하여 38 바이트 (총 83 바이트)로 줄였습니다.
function o($i){return$i.@(($j=abs($i)%100)>10&&$j<14?th:[th,st,nd,rd][$j%10]?:th);}
우리는 이것이 이것보다 짧을 수 있다고 생각하지 않습니다! 그러나 잘못 될 것입니다. :)
모두 즐기시기 바랍니다.
abs()
모듈러스와 함께 사용할 필요는 없습니다.%
abs();
내가 필요한 음수 부호를 제거합니다.
mktime ()을 사용하지 않고 pecl intl을 요구하지 않고 월의 날짜 (최대 31 개)에 대한 더 짧은 버전 :
function ordinal($n) {
return (new DateTime('Jan '.$n))->format('jS');
}
또는 절차 상 :
echo date_format(date_create('Jan '.$n), 'jS');
내가 선택한 (1 월) 기본 월에 31 일이 있기 때문에 물론 작동합니다.
흥미롭게도 2 월 (또는 31 일이없는 다른 달)으로 시도하면 끝 전에 다시 시작됩니다.
...clip...
31st
1st
2nd
3rd
그래서 t
루프 의 날짜 지정자를 사용하여이 달의 일 수를 계산할 수 있습니다. 월의 일 수입니다.
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';
}
?>
나는이 작은 발췌문을 좋아한다
<?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';
}
?>