เพิ่มคำต่อท้าย st, nd, rd และ th (ลำดับ) ไปที่ตัวเลข


150

ฉันต้องการสร้างสตริงข้อความแบบไดนามิกตามวันที่ปัจจุบัน ตัวอย่างเช่นถ้าเป็นวันที่ 1 ฉันต้องการให้โค้ดของฉันสร้าง = "มันคือ <dynamic> 1 * <ไดนามิกสตริง> st </ ไดนามิกสตริง> * </dynamic>"

มีทั้งหมด 12 วันดังนั้นฉันได้ทำสิ่งต่อไปนี้:

  1. ฉันได้ตั้งค่า for for loop ที่วนรอบ 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"
    }

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

1
หากซอร์สโค้ดของคุณสั้นพอคุณจะโพสต์สิ่งที่ดีและบอกว่าสิ่งที่ผิดหรือสิ่งที่ทำให้คุณสับสน
RonaldBarzell

รหัสของคุณทำอะไร / ไม่ได้ทำในปัจจุบัน? คุณไม่ได้ระบุอย่างชัดเจนว่าเกิดอะไรขึ้น
Pointy

ฉันคาดเดารหัสที่แสดงเป็นเนื้อหาของifบล็อกที่มีวงต่อไปหรือไม่ แสดงรหัสเพิ่มเติม ....
MrCode

@MrCode - ใช่คุณถูกต้อง ฉันได้อัปเดตโพสต์เพื่อรวมทั้งลูป ฉันหวังว่านี้จะล้างมันขึ้น!
Antonio Vasilev

เรียบร้อยและทำงานได้ดี
Dan Jay

คำตอบ:


345

กฎมีดังนี้

  • st ใช้กับตัวเลขที่ลงท้ายด้วย 1 (เช่นที่ 1 ออกเสียงเป็นคนแรก)
  • nd ใช้กับตัวเลขที่ลงท้ายด้วย 2 (เช่น 92nd, ออกเสียงเก้าสิบวินาที)
  • rd ใช้กับตัวเลขที่ลงท้ายด้วย 3 (เช่น 33rd, ออกเสียงสามสิบสาม)
  • เป็นข้อยกเว้นสำหรับกฎข้างต้นตัวเลข "วัยรุ่น" ทั้งหมดที่ลงท้ายด้วย 11, 12 หรือ 13 การใช้งาน -th (เช่น 11th, 11, 11, 112, เด่นชัดหนึ่งร้อย [และ] สิบสอง)
  • th ใช้สำหรับตัวเลขอื่น ๆ ทั้งหมด (เช่น 9th, ออกเสียงเก้า)

รหัส JavaScript ต่อไปนี้ (เขียนใหม่ใน Jun '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

1
มันทำงานได้ดีสำหรับฉันเช่นกัน: dateString = monthNames [newValue.getUTCMonth ()] + "" + numberSuffix (newValue.getUTCDate ()) + ", newValue.getUTCFullYear ();
Michael J. Calkins

9
สิ่งนี้ไม่สามารถจัดการข้อยกเว้นสำหรับหมายเลข "teen" สามตัวได้ ยกตัวอย่างเช่นตัวเลข111, 112และ113จะส่งผลให้"111th", "112th"และ"113th"ตามลำดับไม่"111st" , "112nd"และ"113rd"ผลิตโดยฟังก์ชั่นเป็นรหัสในปัจจุบัน
martineau

3
คำตอบนี้ดูเหมือนจะมีวิวัฒนาการอย่างสมบูรณ์แบบ ขอขอบคุณผู้มีส่วนร่วมทั้งหมด
Lonnie Best

7
ฉันรวมมันเป็นแลมบ์ดา ES6 โดยไม่มีเหตุผลจริง:n=>n+(n%10==1&&n%100!=11?'st':n%10==2&&n%100!=12?'nd':n%10==3&&n%100!=13?'rd':'th')
Camilo Martin

1
@ Anomaly สนุกพอหลังจาก ~ π / 2 ปีต่อมาฉันยังสามารถอ่านได้
Camilo Martin

210

จากShopify

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

[-4,-1,0,1,2,3,4,10,11,12,13,14,20,21,22,100,101,111].forEach(
  n => console.log(n + ' -> ' + getNumberWithOrdinal(n))
);


22
การเพิ่มคำอธิบายสามารถทำให้เป็นคำตอบที่ดียิ่งขึ้น!
Pugazh

5
@Pugazh A.หา s [v% 10] ถ้า> = 20 (20 ... 99th), B.หากไม่พบลอง s [v] (0th..3rd), C.หากยังไม่พบใช้ s [0] (วันที่ 4.9th)
Sheepy

4
ทำไม double ถึงได้ชื่อฟังก์ชันแม้ว่า
Gisheri

46

วิธีหนึ่งบรรทัดที่น้อยที่สุดสำหรับคำต่อท้ายตามลำดับ

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 (ฟังก์ชันที่ไม่ระบุตัวตน):

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

ปรับปรุง

ทางเลือกที่สั้นกว่าสำหรับจำนวนเต็มบวกคือนิพจน์

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

ดูโพสต์นี้สำหรับคำอธิบาย

อัปเดต 2

[,'st','nd','rd'][n/10%10^1&&n%10]||'th'

3
สง่า ของโปรด.
ผู้ชาย mograbi


10

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(201)
	.fill()
	.map((_, index) => index - 100)
	.map(ordinal)
	.join(" ");
console.log(test);


1
นี่เป็นคำตอบทั่วไปที่ดีเพียงข้อเดียวเพราะเป็นคำตอบเดียวที่จัดการกับจำนวนลบ
RobG

7

คุณมีเวลาเพียง 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'

ขอบคุณสิ่งนี้แก้ปัญหาของฉันได้ ฉันไม่สามารถหาคำต่อท้ายให้ตรงกับวันได้ดังนั้นฉันจึงเติมอาร์เรย์ด้วยทั้งตัวเลขและคำต่อท้ายซึ่งทำงานได้อย่างสมบูรณ์ จากนั้นฉันก็เรียกมันว่า$("#dynamicTitle span").html(suffix[i-1]);
Antonio Vasilev

7

ด้วยการแบ่งตัวเลขออกเป็นอาเรย์และย้อนกลับเราสามารถตรวจสอบตัวเลข 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";
}

มันสมบูรณ์แบบ ขอบคุณ!
เจสัน

คุณต้องยกเว้น 11, 12, 13
psx

2
@psx นั่นคือเงื่อนไขของบรรทัดที่ 5
กรงขัง

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

ออนไลน์เนอร์ที่ดีเพียงเล็กน้อยยากที่จะเข้าใจ
bryc

ล้มเหลวโดยที่ n == 0 เนื่องจากn - 1ส่วนหนึ่ง (ส่งคืนไม่ได้กำหนด) นอกจากนี้ยังล้มเหลวสำหรับตัวเลขที่มากกว่า 110 เช่นgetSuffix(111)ส่งคืน "st" มันแก้ปัญหา OP ได้โดยที่ตัวเลขคือ 1 ถึง 12 แต่ไม่ใช่วิธีแก้ปัญหาทั่วไป :-(
RobG

2

ฉันเขียนฟังก์ชันนี้เพื่อแก้ปัญหานี้:

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

ฉันคิดว่าnumberในสตริงนี้var lastDigits=n.substring(number.length-2);ควรเปลี่ยนเป็นthis
Slava Abakumov

มันควรจะเป็นnแทนthisแต่ขอบคุณสำหรับการชี้จุดบกพร่องนั้นออก! :)
Jimmery

2

รุ่นทางเลือกของฟังก์ชันอันดับอาจเป็นดังนี้:

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

ตัวแปรมีการตั้งชื่ออย่างชัดเจนยิ่งขึ้นใช้ระเบียบกรณีของอูฐและอาจเร็วกว่า


สิ่งนี้จะไม่ทำงานสำหรับฐานรหัสที่แปลเป็นภาษาท้องถิ่น
Daniel Harvey

1

ฉันเขียนฟังก์ชั่นง่าย ๆ เมื่อวันก่อน แม้ว่าสำหรับวันที่คุณไม่ต้องการตัวเลขที่ใหญ่กว่านี้จะรองรับค่าที่สูงขึ้นเช่นกัน (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;
};

1

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

ควรสั้นหวานและมีประสิทธิภาพเหมือนกับฟังก์ชั่นยูทิลิตี้ ทำงานร่วมกับจำนวนเต็ม / ลอยลงนาม / ไม่ได้ลงนามใด ๆ (แม้ว่าฉันไม่สามารถจินตนาการถึงความจำเป็นในการกำหนดลำดับการลอย)


0

นี่คือตัวเลือกอื่น

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


0

ฉันต้องการให้คำตอบที่ใช้งานได้กับคำถามนี้เพื่อเติมเต็มคำตอบที่มีอยู่:

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 หรือน้อยกว่านั้นถูกนำมาจากอาร์เรย์

ตัวอย่างผลลัพธ์:

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

0

อันเก่าที่ฉันทำเพื่อสิ่งของของฉัน ...

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

เพิ่มคำอธิบายบางอย่างเกี่ยวกับโค้ดด้านบน มันจะช่วยได้มากกว่าโค้ดหนึ่งชิ้น
แมทธิวส์ซันนี่


0

ฉันเขียนฟังก์ชันนี้สำหรับตัวเลขที่สูงขึ้นและกรณีทดสอบทั้งหมด

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

0

นี่เป็นวิธีที่แตกต่างกันเล็กน้อย (ฉันไม่คิดว่าคำตอบอื่นจะทำสิ่งนี้) ฉันไม่แน่ใจว่าฉันจะรักหรือเกลียด แต่มันได้ผล!

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

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

0

นี่คือหนึ่งตอร์ปิโดและคนรักของ es6

let i= new Date().getDate 

// I can be any number, for future sake we'll use 9

const j = I % 10;
const k = I % 100;

i = `${i}${j === 1 &&  k !== 11 ? 'st' : j === 2 && k !== 12 ? 'nd' : j === 3 && k !== 13 ? 'rd' : 'th'}`}

console.log(i) //9th

ตัวเลือกสำหรับ + ​​เป็นตัวเลขจะเป็น:

console.log(["st","nd","rd"][((i+90)%100-10)%10-1]||"th"]

นอกจากนี้เพื่อกำจัดคำนำหน้าลำดับเพียงใช้เหล่านี้:

console.log(i.parseInt("8th"))

console.log(i.parseFloat("8th"))

อย่าลังเลที่จะปรับเปลี่ยนให้เหมาะกับความต้องการของคุณ


0

คุณยังสามารถใช้scales::ordinal()ฟังก์ชั่น มันรวดเร็วและใช้งานง่าย

scales::ordinal(1:12)
## [1] "1st"  "2nd"  "3rd"  "4th"  "5th"  "6th"  "7th"  "8th"  "9th"  "10th" "11th" "12th"

-1

ฉันขอแนะนำอย่างนี้มันเป็นเรื่องง่ายและตรงไปตรงมาเพื่ออ่าน ฉันหวังว่ามันจะช่วยได้?

  • มันหลีกเลี่ยงการใช้จำนวนเต็มลบเช่นจำนวนน้อยกว่า 1 และกลับเท็จ
  • มันจะคืนค่า 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

-7

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

คุณสามารถใช้ได้

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

สำหรับการวางตำแหน่งคำต่อท้าย


4
นี่ไม่ใช่สิ่งที่ OP ขอมา
TetraDev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.