Подтвердить что ты не робот

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

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

Всего 12 дней, поэтому я сделал следующее:

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

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

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

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

ОБНОВЛЕНИЕ

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

$(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) {
            }
        }
    }
4b9b3361

Ответ 1

Правила заключаются в следующем:

  • st используется с номерами, заканчивающимися на 1 (например, 1-й, произносится первым)
  • nd используется с номерами, заканчивающимися на 2 (например, 92-й, произносится девяносто второй)
  • rd используется с числами, заканчивающимися на 3 (например, 33-й, выраженный тридцать третий).
  • В качестве исключения из вышеприведенных правил все "подростковые" числа, заканчивающиеся на 11, 12 или 13, используют -th (например, 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

Ответ 2

От Shopify

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

Ответ 3

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

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>

Ответ 4

У вас всего 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'

Ответ 5

Разбирая число в массив и реверсируя, мы можем легко проверить последние 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";
}

Ответ 6

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

Ответ 7

Я написал эту функцию для решения этой проблемы:

// 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

Ответ 8

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

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

Переменные называются более явно, использует соглашение о случае с верблюдом и может быть быстрее.

Ответ 9

Я написал эту простую функцию на днях. Хотя для даты вам не нужны большие числа, это также будет обслуживать более высокие значения (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;
};

Ответ 10

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

Короткие, сладкие и эффективные, как и функции утилиты. Работает с любым подписанным /unsigned integer/float. (Несмотря на то, что я не могу представить себе необходимость упорядочивать поплавки)

Ответ 11

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

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

Ответ 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'.

Наш номер функции. Доверенный проверяет, заканчивается ли число в подростковом номере, в этом случае добавьте число с "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

Ответ 13

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

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

Ответ 14

Настоятельно рекомендуем отличную библиотеку date-fns. Быстро, модульно, неизменно, работает со стандартными датами.

import * as DateFns from 'date-fns';

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

См. Документы date-fns: https://date-fns.org/v2.0.0-alpha.9/docs/format

Ответ 15

Я написал эту функцию для более высоких чисел и всех тестовых примеров

function numberToOrdinal(num) {
    if (num === 0) {
        return '0'
    };
    let i = num.toString(), j = i.slice(i.length - 2), k = i.slice(i.length - 1);
    if (j >= 10 && j <= 20) {
        return (i + 'th')
    } else if (j > 20 && j < 100) {
        if (k == 1) {
            return (i + 'st')
        } else if (k == 2) {
            return (i + 'nd')
        } else if (k == 3) {
            return (i + 'rd')
        } else {
            return (i + 'th')
        }
    } else if (j == 1) {
        return (i + 'st')
    } else if (j == 2) {
        return (i + 'nd')
    } else if (j == 3) {
        return (i + 'rd')
    } else {
        return (i + 'th')
    }
}

Ответ 16

Intl.PluralRules, стандартный метод.

Я просто хотел бы опустить здесь канонический метод, поскольку никто, кажется, не знает его.

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

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

Ответ 17

Я не вижу этот стиль es6 в списке ответов на этой странице, и это то, что я использую:

const ordinal_suffix_of = (i) => {
  const 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"
}

Ответ 18

попробовать

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)

Ответ 19

Я настоятельно рекомендую это, это очень легко и просто читать. Надеюсь, это поможет?

  • Это позволяет избежать использования отрицательного целого числа, т.е. Числа меньше 1, и возвращает false
  • Возвращает 0, если вход 0
function numberToOrdinal(n) {

  let result;

  if(n < 0){
    return false;
  }else if(n === 0){
    result = "0";
  }else if(n > 0){

    let nToString = n.toString();
    let lastStringIndex = nToString.length-1;
    let lastStringElement = nToString[lastStringIndex];

    if( lastStringElement == "1" && n % 100 !== 11 ){
      result = nToString + "st";
    }else if( lastStringElement == "2" && n % 100 !== 12 ){
      result = nToString + "nd";
    }else if( lastStringElement == "3" && n % 100 !== 13 ){
      result = nToString + "rd";
    }else{
      result = nToString + "th";
    }

  }

  return result;
}

console.log(numberToOrdinal(-111));
console.log(numberToOrdinal(0));
console.log(numberToOrdinal(11));
console.log(numberToOrdinal(15));
console.log(numberToOrdinal(21));
console.log(numberToOrdinal(32));
console.log(numberToOrdinal(43));
console.log(numberToOrdinal(70));
console.log(numberToOrdinal(111));
console.log(numberToOrdinal(300));
console.log(numberToOrdinal(101));

ВЫХОД

false
0
11th
15th
21st
32nd
43rd
70th
111th
300th
101st

Ответ 20

Здесь немного другой подход (я не думаю, что другие ответы делают это). Я не уверен, люблю ли я это или ненавижу, но это работает!

export function addDaySuffix(day: number) { 
  const suffixes =
      '  stndrdthththththththththththththththththstndrdthththththththst';
    const startIndex = day * 2;

    return '${day}${suffixes.substring(startIndex, startIndex + 2)}';
  }

Ответ 21

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