167 votes

php afficher le numéro avec le préfixe

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

317voto

Iacopo Points 1747

de 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 est le numéro que vous voulez écrire. Fonctionne avec n'importe quel nombre naturel.

166voto

jeremy Points 6308

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.

24voto

Andrew Kozak Points 1281

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!

17voto

Paul Points 2325

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.

13voto

John Boker Points 36308

à 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.com

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.

Powered by:

X