Добавить St, nd, rd и th (порядковый) суффикс к числу


Я хотел бы динамически генерировать строку текста на основе текущего дня. Так, например, если это день 1, то я хотел бы, чтобы мой код генерировал = "его 1* st*".

есть 12 дней в общей сложности, так что я сделал следующее:

  1. Я установил цикл for, который проходит через 12 дней.

  2. в моем html я дал моему элементу уникальный идентификатор с что для этого нужно сделать, смотрите ниже:

    <h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
    
  3. затем внутри моего цикла у меня есть следующий код:

    $("#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"
    }
    

обновление

Это весь цикл for по запросу:

$(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) {
            }
        }
    }
16 88

16 ответов:

The правила следующим образом:

  • st используется с числами, заканчивающимися на 1 (например, 1-й, произносится первым)
  • nd используется с числами, заканчивающимися на 2 (например, 92-й, произносится девяносто второй)
  • rd используется с числами, заканчивающимися на 3 (например, 33-й, произносится тридцать третий)
  • в качестве исключения из вышеприведенных правил все "подростковые" числа, заканчивающиеся на 11, 12 или 13, используют-й (например, 11-й, произносится одиннадцатый, 112-й, произносится сто [и] двенадцатый)
  • th используется для всех других чисел (например, 9-й, произносится девятый).

следующий код JavaScript (переписанный в июне '14) выполняет это:

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

пример вывода для чисел между 0-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

С Shopify

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

минимальный однострочный подход для порядковых суффиксов

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

(это для положительных целых чисел, см. ниже для других вариантов)

объяснение

начните с массива с суффиксами ["st", "nd", "rd"]. Мы хотим сопоставить целые числа, заканчивающиеся на 1, 2, 3 (но не заканчивающиеся на 11, 12, 13) с индексами 0, 1, 2.

другие целые числа (включая те, которые заканчиваются на 11, 12, 13) могут быть сопоставлены с чем-либо еще-индексы, не найденные в массиве, будут оцениваться undefined. Это ложь в JavaScript и с использованием логического ИЛИ (|| "th") выражение вернет "th" для этих целых чисел, что именно то, что мы хотим.

выражение ((n + 90) % 100 - 10) % 10 - 1 сопоставление. Разбивая его:

  • (n + 90) % 100: это выражение принимает входное целое число-10 mod 100, отображение 10 в 0, ... От 99 до 89, от 0 до 90, ..., 9 до 99. Теперь целые числа, заканчивающиеся на 11, 12, 13 находятся в нижнем конце (отображается на 1, 2, 3).
  • - 10: теперь 10 отображается на -10, 19 до -1, 99 до 79, 0 до 80, ... 9 до 89. Числа, оканчивающиеся на 11, 12, 13, сопоставляются с отрицательными числами (-9, -8, -7).
  • % 10: теперь все целые числа, заканчивающиеся на 1, 2 или 3, отображаются на 1, 2, 3. Все остальные целые числа отображаются на что-то другое (11, 12, 13 по-прежнему отображаются на -9, -8, -7).
  • - 1: вычитание одного дает окончательное отображение 1, 2, 3 в 0, 1, 2.

проверка что это работает

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>

варианты

разрешение отрицательных целых чисел:

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

в синтаксисе ES6 fat arrow (анонимная функция):

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

обновление

еще более короткой альтернативой для положительных целых чисел является выражение

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

посмотреть этот пост для объяснения.

У вас есть только 12 дней? Я был бы соблазн сделать это просто время поиска:

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

затем

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

или

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

путем разбиения числа на массив и реверсирования мы можем легко проверить последние 2 цифры числа с помощью array[0] и array[1].

если число находится в подростковом возрасте array[1] = 1 для этого требуется "th".

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

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

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

Я написал эту функцию, чтобы решить эту проблему:

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

С этим вы можете просто поставить .addSuffix() в любом количестве и это приведет к тому, что вы хотите. Например:

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

Я написал эту простую функцию на днях. Хотя на сегодняшний день Вы не нуждаетесь в больших количествах, это позволит удовлетворить более высокие значения тоже (1013-м 36021st и т. д...)

var fGetSuffix = function(nPos){

    var sSuffix = "";

    switch (nPos % 10){
        case 1:
            sSuffix = (nPos % 100 === 11) ? "th" : "st";
            break;
        case 2:
            sSuffix = (nPos % 100 === 12) ? "th" : "nd";
            break;
        case 3:
            sSuffix = (nPos % 100 === 13) ? "th" : "rd";
            break;
        default:
            sSuffix = "th";
            break;
    }

    return sSuffix;
};

function ordsfx(a){return["th","st","nd","rd"][(a=~~(a<0?-a:a)%100)>10&&a<14||(a%=10)>3?0:a]}

смотрите аннотированную версию по адресу https://gist.github.com/furf/986113#file-annotated-js

короткий, сладкий и эффективный, как и функции полезности должны быть. Работает с любым подписанным / беззнаковым целым числом / float. (Хотя я не могу себе представить, что нужно упорядочить поплавки)

альтернативная версия порядковой функции может быть следующей:

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

переменные называются более явно, использует Camel case convention и может быть быстрее.

вот еще один вариант.

function getOrdinalSuffix(day) {
        
   	if(/^[2-3]?1$/.test(day)){
   		return 'st';
   	} else if(/^[2-3]?2$/.test(day)){
   		return 'nd';
   	} else if(/^[2-3]?3$/.test(day)){
   		return 'rd';
   	} else {
   		return 'th';
   	}
        
}
    
console.log(getOrdinalSuffix('1'));
console.log(getOrdinalSuffix('13'));
console.log(getOrdinalSuffix('22'));
console.log(getOrdinalSuffix('33'));

обратите внимание на исключение для подростков? Подростки такие аквард!

правка: забыл про 11 и 12

Я хотел дать функциональный ответ на этот вопрос, чтобы дополнить существующий ответ:

const ordinalSuffix = ['st', 'nd', 'rd']
const addSuffix = n => n + (ordinalSuffix[(n - 1) % 10] || 'th')
const numberToOrdinal = n => `${n}`.match(/1\d$/) ? n + 'th' : addSuffix(n)

мы создали массив специальных значений, важно помнить, что массивы имеют нулевой индекс, поэтому ordinalSuffix[0] равен 'st'.

наша функция numberToOrdinal проверяет, заканчивается ли число на число подростка, и в этом случае добавьте число с "th", поскольку все порядковые номера тогда являются "th". В том случае, если номер не подросток Мы передайте число в addSuffix, который добавляет число к порядковому номеру, который определяется, если число минус 1 (потому что мы используем индекс на основе нуля) mod 10 имеет остаток от 2 или меньше, он взят из массива, в противном случае это "th".

пример вывода:

numberToOrdinal(1) // 1st
numberToOrdinal(2) // 2nd
numberToOrdinal(3) // 3rd
numberToOrdinal(4) // 4th
numberToOrdinal(5) // 5th
numberToOrdinal(6) // 6th
numberToOrdinal(7) // 7th
numberToOrdinal(8) // 8th
numberToOrdinal(9) // 9th
numberToOrdinal(10) // 10th
numberToOrdinal(11) // 11th
numberToOrdinal(12) // 12th
numberToOrdinal(13) // 13th
numberToOrdinal(14) // 14th
numberToOrdinal(101) // 101st

старый, который я сделал для своих вещей...

function convertToOrdinal(number){
    if (number !=1){
        var numberastext = number.ToString();
        var endchar = numberastext.Substring(numberastext.Length - 1);
        if (number>9){
            var secondfromendchar = numberastext.Substring(numberastext.Length - 1);
            secondfromendchar = numberastext.Remove(numberastext.Length - 1);
        }
        var suffix = "th";
        var digit = int.Parse(endchar);
        switch (digit){
            case 3:
                if(secondfromendchar != "1"){
                    suffix = "rd";
                    break;
                }
            case 2:
                if(secondfromendchar != "1"){
                    suffix = "nd";
                    break;
                }
            case 1:
                if(secondfromendchar != "1"){
                    suffix = "st";
                    break;
                }
            default:
                suffix = "th";
                break;
         }
            return number+suffix+" ";
     } else {
            return;
     }
}

настоятельно рекомендую великолепную дата-ФНС библиотека. Быстрый, модульный, неизменяемый, работает со стандартными датами.

import * as DateFns from 'date-fns';

const ordinalInt = DateFns.format(someInt, 'do');

см. date-FNS docs:https://date-fns.org/v2.0.0-alpha.9/docs/format

попробовать

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

console.log(getOrdinal(10)

<p>31<sup>st</sup> March 2015</p>

можно использовать

1<sup>st</sup> 2<sup>nd</sup> 3<sup>rd</sup> 4<sup>th</sup>

для позиционирования суффикс