我想动态生成基于当前一天的文本字符串。所以,例如,如果它是第1天,那么我想我的代码生成=“它的<动态>1*<动态字符串>st</动态字符串>*</动态>”。

总共有12天,所以我做了以下事情:

我设置了一个for循环,循环12天。 在我的html中,我已经给了我的元素一个唯一的id来瞄准它,如下所示: <h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1> 然后,在我的for循环中,我有以下代码: $ (" # dynamicTitle跨度”). html(我); Var day = i; If (day == 1) { Day = I +“st”; } else if (day == 2) { 日= 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) {
            }
        }
    }

当前回答

您可以使用瞬时库的本地数据函数。

代码:

moment.localeData().ordinal(1)
//1st

其他回答

我为更大的数字和所有测试用例写了这个函数

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

规则如下:

St用于以1结尾的数字(例如1st,发音为first) Nd与以2结尾的数字连用(例如92nd,发音为ninety-second) Rd与以3结尾的数字连用(例如33rd,发音为33third) 作为上述规则的例外,所有以11、12或13结尾的“青少年”数字都使用-th(例如,11,发音为111,112, 读作一百零十二位) Th用于所有其他数字(例如:9th,发音为ninth)。

以下JavaScript代码(在14年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

我想为这个问题提供一个功能性的答案,以补充现有的答案:

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'。如果数字不是teen,我们将数字传递给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 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: This expression takes the input integer − 10 mod 100, mapping 10 to 0, ... 99 to 89, 0 to 90, ..., 9 to 99. Now the integers ending in 11, 12, 13 are at the lower end (mapped to 1, 2, 3). - 10: Now 10 is mapped to −10, 19 to −1, 99 to 79, 0 to 80, ... 9 to 89. The integers ending in 11, 12, 13 are mapped to negative integers (−9, −8, −7). % 10: Now all integers ending in 1, 2, or 3 are mapped to 1, 2, 3. All other integers are mapped to something else (11, 12, 13 are still mapped to −9, −8, −7). - 1: Subtracting one gives the final mapping of 1, 2, 3 to 0, 1, 2.

验证它的工作

函数n (n){返回(“圣”、“和”、“采访”][100 - 10 ((n + 90) %) % 10:1] | |“th”} //测试1到124之间的整数 对于(var r = [], I = 1;I < 125;I ++) r.push(I + n (I)); / /输出结果 . getelementbyid(的结果)。innerHTML = r.join('<br>'); < div id = "结果" > < / div >

变化

允许负整数:

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

函数n (n){返回(“圣”、“和”、“路”)((((n < 0 ? - n: n) + 90) % 100 - 10) % 10:1] | |“th”} //测试15到-124之间的整数 对于(var r = [], I = 15;I > -125;I——)r.push(I + n (I)); / /输出结果 . getelementbyid(的结果)。innerHTML = r.join('<br>'); < div id = "结果" > < / div >

在ES6胖箭头语法中(匿名函数):

n=>["st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10-1]||"th"
const getOrdinalNum = (n) => n + (n > 0 ? ['th', 'st', 'nd', 'rd'][(n > 3 && n < 21) || n % 10 > 3 ? 0 : n % 10] : '');