次のように数字を表示したい
- 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の組み込みの日付/時刻関数の同様の機能を利用して、1行で実行できます。何卒よろしくお願いいたします。
解決:
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) ));
便利なように関数にラップするだけで、すぐに使えます!
ここにワンライナーがあります:
$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';
}
?>
PHPのdate();
機能に依存しない機能を必要とせず、現在可能な限りコンパクトで短い機能を作りました。
コード:(合計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)
確定申告書の冒頭で)。format_number($i)
最後のreturnステートメントの先頭にして、コンマ区切りの整数を取得ます(数千、数百万などを表示している場合)。$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:
ベンと私は協力して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()を使用せずに月の日付をさらに短くしたバージョン(最大31)で、pecl intlを必要としません。
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
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';
}
?>