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

10voto

nick Points 157

En divisant le nombre dans un tableau et en inversant, nous pouvons facilement vérifier les 2 derniers chiffres du nombre en utilisant array[0] y array[1] .

Si un nombre est dans les dix ans array[1] = 1 il faut "th".

function getDaySuffix(num)
{
    var array = ("" + num).split("").reverse(); // E.g. 123 = array("3","2","1")

    if (array[1] != "1") { // Number is not in the teens
        switch (array[0]) {
            case "1": return "st";
            case "2": return "nd";
            case "3": return "rd";
        }
    }

    return "th";
}

7voto

Jamiec Points 35773

Vous n'avez que 12 jours ? Je serais tenté d'en faire un simple tableau de consultation :

var suffixes = ['','st','nd','rd','th','th','th','th','th','th','th','th','th'];

puis

var i = 2;
var day = i + suffixes[i]; // result: '2nd'

ou

var i = 8;
var day = i + suffixes[i]; // result: '8th'

5voto

Johnny Points 57
function getSuffix(n) {return n < 11 || n > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((n - 1) % 10, 3)] : 'th'}

3voto

Jimmery Points 1950

J'ai écrit cette fonction pour résoudre ce problème :

// this is for adding the ordinal suffix, turning 1, 2 and 3 into 1st, 2nd and 3rd
Number.prototype.addSuffix=function(){
    var n=this.toString().split('.')[0];
    var lastDigits=n.substring(n.length-2);
    //add exception just for 11, 12 and 13
    if(lastDigits==='11' || lastDigits==='12' || lastDigits==='13'){
        return this+'th';
    }
    switch(n.substring(n.length-1)){
        case '1': return this+'st';
        case '2': return this+'nd';
        case '3': return this+'rd';
        default : return this+'th';
    }
};

Avec cela, vous pouvez simplement mettre .addSuffix() à n'importe quel nombre et il en résultera ce que vous voulez. Par exemple :

var number=1234;
console.log(number.addSuffix());
// console will show: 1234th

3voto

Daniel Harvey Points 29

Une autre version de la fonction ordinale pourrait être la suivante :

function toCardinal(num) {
    var ones = num % 10;
    var tens = num % 100;

    if (tens < 11 || tens > 13) {
        switch (ones) {
            case 1:
                return num + "st";
            case 2:
                return num + "nd";
            case 3:
                return num + "rd";
        }
    }

    return num + "th";
}

Les variables sont nommées de manière plus explicite, utilise la convention de la casse de type camel, et peut être plus rapide.

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