php - name - get tags wordpress




Mostrar números con sufijo ordinal en PHP (10)

Aquí hay un trazador de líneas:

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

Probablemente la solución más corta. Por supuesto, puede ser envuelto por una función:

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

Saludos, Paul

EDIT1: Corrección de código para 11 a 13.

EDIT2: Corrección de código para 111, 211, ...

EDIT3: Ahora funciona correctamente también para múltiplos de 10.

Quiero mostrar los números de la siguiente manera

  • 1 como 1er,
  • 2 como 2do,
  • ...,
  • 150 como 150º.

¿Cómo debo encontrar el sufijo ordinal correcto (st, nd, rd o th) para cada número en mi código?


Encontré una respuesta en 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';
}
?>

Esto se puede lograr en una sola línea mediante el aprovechamiento de una funcionalidad similar en las funciones de fecha / hora integradas de PHP. Humildemente presento:

Solución:

function ordinalSuffix( $n )
{
  return date('S',mktime(1,1,1,1,( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));
}

Explicación detallada:

La función de date() incorporada date() tiene lógica de sufijo para manejar cálculos de n-día-del-mes. El sufijo se devuelve cuando se da S en la cadena de formato:

date( 'S' , ? );

Como date() requiere una marca de tiempo (para ? Encima), pasaremos nuestro entero $n como parámetro de day a mktime() y usamos valores ficticios de 1 para la hour , minute , second y month :

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

En realidad, esto falla con gracia en los valores fuera de rango para un día del mes (es decir, $n > 31 ) pero podemos agregar alguna lógica en línea simple para cap $n en 29:

date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20))*10 + $n%10) ));

El único valor positivo ( Mayo de 2017 ) este error es $n == 0 , pero eso se soluciona fácilmente agregando 10 en ese caso especial:

date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n>=20)+($n==0))*10 + $n%10) ));

Actualización, mayo de 2017

Según lo observado por @donatJ, lo anterior falla por encima de 100 (p. Ej., "111st"), ya que las comprobaciones >=20 siempre son verdaderas. Para restablecer estos cada siglo, agregamos un filtro a la comparación:

date( 'S', mktime( 1, 1, 1, 1, ( (($n>=10)+($n%100>=20)+($n==0))*10 + $n%10) ));

Solo envuélvela en una función para mayor comodidad y listo.


Genéricamente, puede usar eso y llamar a 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';
}
?>

La respuesta simple y fácil será:

$Day = 3; 
echo date("S", mktime(0, 0, 0, 0, $Day, 0));

//OUTPUT - rd

Me gusta este pequeño fragmento

<?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';
  }

?>

HERE


Una versión aún más corta para las fechas del mes (hasta 31) en lugar de usar mktime () y no requiere pecl intl:

function ordinal($n) {
    return (new DateTime('Jan '.$n))->format('jS');
}

o procedimentalmente:

echo date_format(date_create('Jan '.$n), 'jS');

Esto funciona, por supuesto, porque el mes predeterminado que elegí (enero) tiene 31 días.

Curiosamente, si lo intentas con febrero (u otro mes sin 31 días), se reinicia antes del final:

...clip...
31st
1st
2nd
3rd

para que pueda contar hasta los días de este mes con el especificador de fecha t en su ciclo: número de días en el mes.


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

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];

Donde $number es el número que desea escribir. Funciona con cualquier número natural.

Como una función:

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 tiene una funcionalidad incorporada para esto . ¡Incluso maneja la internacionalización!

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

Tenga en cuenta que esta funcionalidad solo está disponible en PHP 5.3.0 y posterior.





numbers