将st,nd,rd和th(序数)后缀添加到数字中

我想根据当天dynamic生成一个文本string。 所以,例如,如果是第1天,那么我希望我的代码生成=“它的<dynamic> 1 * <dynamic string> st </ dynamic string> * </ dynamic>”。

总共有12天,所以我做了以下工作:

  1. 我已经build立了一个循环了12天的循环。

  2. 在我的HTML中,我已经给了我的元素一个唯一的ID与它的目标,如下所示:

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

UPDATE

这是整个循环的要求:

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

规则如下:

  • st用于以1结尾的数字(例如1st,先发音)
  • nd被用于以2结尾的数字(例如92nd,发音为90秒)
  • rd用于以3结尾的数字(例如33,发音为33)
  • 作为上述规则的一个例外,所有以十一,十二或十三结尾的“十几岁”数字都使用第十一个(例如第十一个,第十一个,第二百一十一个,第一百一十二个)
  • th用于所有其他数字(例如9,发音为第九)。

以下JavaScript代码(在2014年6月重写)完成了这一点:

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

通过将数字拆分成数组并反转,我们可以使用array[0]array[1]轻松地检查数字的最后两位数字。

如果一个数字在十进制array[1] = 1它需要“th”。

 function getDaySuffix(num) { var array = ("" + num).split("").reverse(); // Eg 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"; } 

你只有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' 
 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 

对于序号后缀最小的一行方法

 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" )expression式将返回这些整数的"th" ,这正是我们想要的。

expression式((n + 90) % 100 - 10) % 10 - 1 10-1进行映射。 打破它:

  • (n + 90) % 100 :这个expression式将input整数–10模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得到- 1的最终映射为0,1,2。

validation它的工作

 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> 

我前些天写了这个简单的函数。 虽然对于一个date你不需要更大的数字,这也会迎合更高的价值(1013th,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上的注释版本;

简短,甜蜜,高效,就像效用函数一样。 与任何有符号/无符号整数/浮点数一起使用。 (尽pipe我无法想象有必要对花车进行sorting)

序数函数的替代版本可能如下:

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

variables被更明确地命名,使用camel case惯例,可能会更快。

这是另一种select。

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

我想为这个问题提供一个function性的答案来补充现有的答案:

 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) 

我们创build了一个特殊值的数组,重要的是要记住的是数组有一个基于零的索引,所以ordinalSuffix [0]等于'st'。

我们的函数NumberToOrdinal检查数字是否以十进制数字结尾,在这种情况下,将数字附加到“th”,因为所有数字序号都是“th”。 如果数字不是十进制的,我们将数字传递给addSuffix,将数字添加到由数字减1(因为我们使用的是基于零的索引)决定的序数,mod 10的余数是2或更less从数组中取出,否则是“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 

尝试

 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>