266 votes

Ajouter les suffixes st, nd, rd et th (ordinal) à un nombre.

Je voudrais générer dynamiquement une chaîne de texte basée sur un jour actuel. Ainsi, par exemple, si c'est le jour 1, je voudrais que mon code génère = "C'est le <dynamique>1*<chaîne dynamique>". st </dynamic string>*</dynamic>".

Il y a 12 jours au total, j'ai donc fait ce qui suit :

  1. J'ai mis en place une boucle for qui passe en revue les 12 jours.

  2. Dans mon html j'ai donné à mon élément un id unique avec lequel le cibler, voir ci-dessous :

    <h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
  3. Ensuite, dans ma boucle for, j'ai le code suivant :

    $("#dynamicTitle span").html(i);
    var day = i;
    if (day == 1) {
        day = i + "st";
    } else if (day == 2) {
        day = i + "nd"
    } else if (day == 3) {
        day = i + "rd"
    }

UPDATE

Il s'agit de la boucle for entière comme demandé :

$(document).ready(function () {
    for (i = 1; i <= 12; i++) {
        var classy = "";
        if (daysTilDate(i + 19) > 0) {
            classy = "future";
            $("#Day" + i).addClass(classy);
            $("#mainHeading").html("");
            $("#title").html("");
            $("#description").html("");
        } else if (daysTilDate(i + 19) < 0) {
            classy = "past";
            $("#Day" + i).addClass(classy);
            $("#title").html("");
            $("#description").html("");
            $("#mainHeading").html("");
            $(".cta").css('display', 'none');
            $("#Day" + i + " .prizeLink").attr("href", "" + i + ".html");
        } else {
            classy = "current";
            $("#Day" + i).addClass(classy);
            $("#title").html(headings[i - 1]);
            $("#description").html(descriptions[i - 1]);
            $(".cta").css('display', 'block');
            $("#dynamicImage").attr("src", ".." + i + ".jpg");
            $("#mainHeading").html("");
            $(".claimPrize").attr("href", "" + i + ".html");
            $("#dynamicTitle span").html(i);
            var day = i;
            if (day == 1) {
                day = i + "st";
            } else if (day == 2) {
                day = i + "nd"
            } else if (day == 3) {
                day = i + "rd"
            } else if (day) {
            }
        }
    }

539voto

Salman A Points 60620

En règles sont les suivants :

  • st est utilisé avec les nombres se terminant par 1 (par exemple, 1st, prononcé first)
  • nd est utilisé avec les nombres se terminant par 2 (par exemple 92nd, prononcé ninety-second)
  • rd est utilisé avec les nombres se terminant par 3 (par exemple 33e, prononcé trente-troisième)
  • Par exception aux règles ci-dessus, tous les nombres "adolescents" se terminant par 11, 12 ou 13 utilisent -th (par exemple, 11e, prononcé onzième, 112e, prononcé cent [et] douzième).
  • th est utilisé pour tous les autres chiffres (par exemple, 9e, prononcé neuvième).

Le code JavaScript suivant (réécrit en juin 14) permet d'y parvenir :

function ordinal_suffix_of(i) {
    var j = i % 10,
        k = i % 100;
    if (j == 1 && k != 11) {
        return i + "st";
    }
    if (j == 2 && k != 12) {
        return i + "nd";
    }
    if (j == 3 && k != 13) {
        return i + "rd";
    }
    return i + "th";
}

Exemple de sortie pour les nombres entre 0 et 115 :

  0  0th
  1  1st
  2  2nd
  3  3rd
  4  4th
  5  5th
  6  6th
  7  7th
  8  8th
  9  9th
 10  10th
 11  11th
 12  12th
 13  13th
 14  14th
 15  15th
 16  16th
 17  17th
 18  18th
 19  19th
 20  20th
 21  21st
 22  22nd
 23  23rd
 24  24th
 25  25th
 26  26th
 27  27th
 28  28th
 29  29th
 30  30th
 31  31st
 32  32nd
 33  33rd
 34  34th
 35  35th
 36  36th
 37  37th
 38  38th
 39  39th
 40  40th
 41  41st
 42  42nd
 43  43rd
 44  44th
 45  45th
 46  46th
 47  47th
 48  48th
 49  49th
 50  50th
 51  51st
 52  52nd
 53  53rd
 54  54th
 55  55th
 56  56th
 57  57th
 58  58th
 59  59th
 60  60th
 61  61st
 62  62nd
 63  63rd
 64  64th
 65  65th
 66  66th
 67  67th
 68  68th
 69  69th
 70  70th
 71  71st
 72  72nd
 73  73rd
 74  74th
 75  75th
 76  76th
 77  77th
 78  78th
 79  79th
 80  80th
 81  81st
 82  82nd
 83  83rd
 84  84th
 85  85th
 86  86th
 87  87th
 88  88th
 89  89th
 90  90th
 91  91st
 92  92nd
 93  93rd
 94  94th
 95  95th
 96  96th
 97  97th
 98  98th
 99  99th
100  100th
101  101st
102  102nd
103  103rd
104  104th
105  105th
106  106th
107  107th
108  108th
109  109th
110  110th
111  111th
112  112th
113  113th
114  114th
115  115th

254voto

Fizer Khan Points 4128

De Shopify

function getNumberWithOrdinal(n) {
  var s = ["th", "st", "nd", "rd"],
      v = n % 100;
  return n + (s[(v - 20) % 10] || s[v] || s[0]);
}

[-4,-1,0,1,2,3,4,10,11,12,13,14,20,21,22,100,101,111].forEach(
  n => console.log(n + ' -> ' + getNumberWithOrdinal(n))
);

111voto

Tomas Langkaas Points 2508

Approche minimale en une ligne pour les suffixes ordinaux

function nth(n){return["st","nd","rd"][((n+90)%100-10)%10-1]||"th"}

(ceci est pour les entiers positifs, voir ci-dessous pour d'autres variations)

Explication

Commencez par un tableau avec les suffixes ["st", "nd", "rd"] . Nous voulons faire correspondre les entiers se terminant par 1, 2, 3 (mais ne se terminant pas par 11, 12, 13) aux index 0, 1, 2.

Les autres entiers (y compris ceux se terminant par 11, 12, 13) peuvent être mappés à n'importe quoi d'autre - les index non trouvés dans le tableau seront évalués à undefined . C'est faussé en javascript et avec l'utilisation de logiques ou ( || "th" ), l'expression renverra "th" pour ces entiers, ce qui est exactement ce que nous voulons.

L'expression ((n + 90) % 100 - 10) % 10 - 1 fait la mise en correspondance. Je le décompose :

  • (n + 90) % 100 : Cette expression prend l'entier d'entrée 10 mod 100, mettant en correspondance 10 à 0, .... 99 à 89, 0 à 90, ..., 9 à 99. Maintenant les entiers se terminant par 11, 12, 13 sont à l'extrémité inférieure (mappés à 1, 2, 3).
  • - 10 : Maintenant 10 est mis en correspondance avec 10, 19 avec 1, 99 avec 79, 0 avec 80, .... 9 à 89. Les entiers se terminant par 11, 12, 13 sont mis en correspondance avec des entiers négatifs (9, 8, 7).
  • % 10 : Maintenant, tous les entiers se terminant par 1, 2 ou 3 sont mis en correspondance avec 1, 2, 3. Tous les autres entiers sont mis en correspondance avec quelque chose d'autre (11, 12, 13 sont toujours mis en correspondance avec 9, 8, 7).
  • - 1 : En soustrayant un, on obtient le mappage final de 1, 2, 3 en 0, 1, 2.

Vérifier que cela fonctionne

function nth(n){return["st","nd","rd"][((n+90)%100-10)%10-1]||"th"}

//test integers from 1 to 124
for(var r = [], i = 1; i < 125; i++) r.push(i + nth(i));

//output result
document.getElementById('result').innerHTML = r.join('<br>');

<div id="result"></div>

Variations

Autoriser les nombres entiers négatifs :

function nth(n){return["st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10-1]||"th"}

function nth(n){return["st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10-1]||"th"}

//test integers from 15 to -124
for(var r = [], i = 15; i > -125; i--) r.push(i + nth(i));

//output result
document.getElementById('result').innerHTML = r.join('<br>');

<div id="result"></div>

Dans la syntaxe ES6 de la grosse flèche (fonction anonyme) :

n=>["st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10-1]||"th"

Mise à jour

Une alternative encore plus courte pour les entiers positifs est l'expression

[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'

Véase ce poste pour une explication.

Mise à jour 2

[,'st','nd','rd'][n/10%10^1&&n%10]||'th'

96voto

Intl.PluralRules le standard método.

Je voudrais juste laisser tomber la façon canonique de faire ici, puisque personne ne semble la connaître.

Si vous voulez que votre code soit

  • auto-documenté
  • facile à localiser
  • avec la norme moderne

c'est la voie à suivre.

const english_ordinal_rules = new Intl.PluralRules("en", {type: "ordinal"});
const suffixes = {
    one: "st",
    two: "nd",
    few: "rd",
    other: "th"
};
function ordinal(number/*: number */) {
    const category = english_ordinal_rules.select(number);
    const suffix = suffixes[category];
    return (number + suffix);
} // -> string

const test = Array(201)
    .fill()
    .map((_, index) => index - 100)
    .map(ordinal)
    .join(" ");
console.log(test);

Code-golf

Alors que je ne pas recommander golfer avec votre code et tuer la lisibilité, je suis venu avec un pour ces golfeurs (92 octets) :

n=>n+{e:"st",o:"nd",w:"rd",h:"th"}[new Intl.PluralRules("en",{type:"ordinal"}).select(n)[2]]

29voto

Theo Kouzelis Points 834

Vous pouvez utiliser le bibliothèques de moment fonctions de données locales .

Código:

moment.localeData().ordinal(1)
//1st

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