Добавить St, nd, rd и th (порядковый) суффикс к числу
Я хотел бы динамически генерировать строку текста на основе текущего дня. Так, например, если это день 1, то я хотел бы, чтобы мой код генерировал = "его 1* st*".
есть 12 дней в общей сложности, так что я сделал следующее:
Я установил цикл for, который проходит через 12 дней.
-
в моем html я дал моему элементу уникальный идентификатор с что для этого нужно сделать, смотрите ниже:
<h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
-
затем внутри моего цикла у меня есть следующий код:
$("#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 ответов:
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