je veux afficher les chiffres comme suit
1 1er, 2 de la 2ème et ainsi de suite jusqu'à 150 150e. le problème est de savoir comment trouver 'st' , 'nd' ,'rd' et 'e' pour les nombres à l'aide de code
je veux afficher les chiffres comme suit
1 1er, 2 de la 2ème et ainsi de suite jusqu'à 150 150e. le problème est de savoir comment trouver 'st' , 'nd' ,'rd' et 'e' pour les nombres à l'aide de code
PHP dispose d'une fonctionnalité intégrée pour cela. Il prend même en charge de l'internationalisation!
$locale = 'en_US';
$nf = new NumberFormatter($locale, NumberFormatter::ORDINAL);
echo $nf->format($number);
Notez que cette fonctionnalité est disponible uniquement en PHP 5.3.0 et plus tard.
Ceci peut être accompli en une seule ligne, en tirant parti des fonctionnalités similaires dans de PHP (date/heure. Je soumets humblement:
Solution:
function ordinalSuffix( $n )
{
return date('S',mktime(1,1,1,1,( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
}
Explication Détaillée:
Le haut- date()
fonction suffixe de la logique de gestion nième jour du mois de calculs. Le suffixe est retournée lorsqu' S
est donné dans la chaîne de format:
date( 'S' , ? );
Depuis date()
nécessite un timestamp ( ?
ci-dessus), nous allons passer notre integer $n
le day
paramètre mktime()
et l'utilisation des valeurs factices d' 1
de la hour
, minute
, second
, et month
:
date( 'S' , mktime( 1 , 1 , 1 , 1 , $n ) );
Cette réalité ne parvient pas normalement sur des valeurs hors de la plage pour une journée du mois (c - $n > 31
) mais on peut ajouter un peu simple inline logique de la pac $n
à 29:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20))*10 + $n%10) ));
Le seul point positif de la valeur à cette échoue sur est - $n == 0
, mais c'est facilement résolu par l'ajout de 10 dans ce cas particulier:
date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
Juste envelopper dans une fonction pour des raisons de commodité et vous partez!
Voici un one-liner:
$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);
Sans doute le plus court de solution. Peut bien sûr être enveloppé par une fonction:
function ord($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);
}
En ce qui concerne, Paul
EDIT1: Correction du code pour les 11 à 13.
EDIT2: Correction du code pour 111, 211, ...
EDIT3: Maintenant il fonctionne correctement aussi pour les multiples de 10.
à partir de 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;
}
?>
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.