source

숫자에 st, nd, rd 및 th(일반) 접미사를 추가합니다.

manycodes 2023. 1. 19. 21:06
반응형

숫자에 st, nd, rd 및 th(일반) 접미사를 추가합니다.

현재 날짜를 기준으로 텍스트 문자열을 동적으로 생성하려고 합니다.예를 들어, 1일째의 경우, 코드로 「Its the <dynamic> 1*<dynamic string>st</dynamic string>*</dynamic>」를 생성해 주세요.

총 12일이기 때문에, 이하의 작업을 실시했습니다.

  1. 12일 동안 루프하는 for 루프를 설정했습니다.

  2. html에서는 요소를 대상으로 하는 고유 ID를 지정했습니다.아래를 참조해 주십시오.

    <h1 id="dynamicTitle" class="CustomFont leftHeading shadow">On The <span></span> <em>of rest of generic text</em></h1>
    
  3. 다음으로 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"
    }
    

갱신하다

이것은 요구대로의 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) {
            }
        }
    }

규칙은 다음과 같습니다.

  • st는 1로 끝나는 숫자와 함께 사용됩니다(예: 첫 번째, 먼저 발음됨).
  • nd는 2로 끝나는 숫자와 함께 사용됩니다(예: 92번째, 902번째 발음).
  • rd는 3으로 끝나는 숫자와 함께 사용됩니다(예: 33번째, 33번째 발음).
  • 상기 규칙의 예외로서 11, 12 또는 13으로 끝나는 모든 "10" 숫자는 -th를 사용합니다(예: 11번째, 11번째, 112번째, 100 [및] 12번째).
  • th는 다른 모든 번호(예: 9번째, 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 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))
);

서수 접미사에 대한 최소 한 줄 접근법

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

(이는 양의 정수에 대한 것입니다. 다른 변형에 대해서는 아래를 참조하십시오.)

설명.

가 합니다.["st", "nd", "rd"](11,를 0, 2.1 2, 3으로 (11, 12, 13으로 끝나는 정수). 0, 1, 2로 매핑합니다.

정수(11,는 다른 수 있습니다. 는 '하다(11, 12, 13)'로 됩니다.배열에서 찾을 수 없는 인덱스는 다음과 같이 평가됩니다.undefined(javascript)를 합니다.|| "th"이 표현은 됩니다.)"th"우리가 원하는 정수에 대한 정보를 제공합니다.

.((n + 90) % 100 - 10) % 10 - 1매핑을 수행합니다.★★★★

  • (n + 90) % 100: 이 - 10 mod 100, , ...to , 0 ..., 9 to 99 를 10 mod 100, 10 to 0, ...99 to 89, 0 to 90, ..., 9 to 99 。이제 11, 12, 13으로 끝나는 정수는 하단(1, 2, 3에 매핑됨)에 있습니다.
  • - 10에서 80, ...에서 89로 : 10 - - 10 、 19 、 - 1, 99 7979 、 0 、 80 、 ...9시 89분이다.정수(-.
  • % 10 1, 2, 2, 모든 , , -7에 이제 1, 2, 3으로 끝나는 모든 정수는 1, 2, 3에 매핑됩니다.다른 모든 정수는 다른 정수에 매핑됩니다(11, 12, 13은 -9, -8, -7에 매핑됩니다).
  • - 1 1, 0,1. : 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"}

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

//test integers from 15 to -124
for(var r = [], i = 15; i > -125; i--) r.push(i + nth(i));

//output result
document.getElementById('result').innerHTML = r.join('<br>');
<div id="result"></div>

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'

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/*: number */) {
    const category = english_ordinal_rules.select(number);
    const suffix = suffixes[category];
    return (number + suffix);
} // -> string

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


코드 골프

당신의 코드로 골프를 쳐서 가독성을 떨어뜨리는 것은 추천하지 않지만, 저는 그 골퍼들을 위해 하나를 생각해냈습니다(92바이트).

n=>n+{e:"st",o:"nd",w:"rd",h:"th"}[new Intl.PluralRules("en",{type:"ordinal"}).select(n)[2]]

모멘트 라이브러리의 로컬 데이터 기능을 사용할 수 있습니다.

코드:

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

로 하면 두 를 쉽게 할 수 .array[0] ★★★★★★★★★★★★★★★★★」array[1].

array[1] = 1 'th', 'th'가 요.

function getDaySuffix(num)
{
    var array = ("" + num).split("").reverse(); // E.g. 123 = array("3","2","1")
    
    if (array[1] != "1") { // Number is not 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';
    }
};

그냥 with with 、 with 、 with with 。.addSuffix()을 사용법예를 들어 다음과 같습니다.

var number=1234;
console.log(number.addSuffix());
// console will show: 1234th
const getOrdinalNum = (n) => n + (n > 0 ? ['th', 'st', 'nd', 'rd'][(n > 3 && n < 21) || n % 10 > 3 ? 0 : n % 10] : '');

서수 함수의 다른 버전은 다음과 같습니다.

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 규칙을 사용하며, 더 빠를 수 있습니다.

이 간단한 함수는 얼마 전에 작성했습니다.큰 숫자는 필요 없지만, 이 값은 높은 값(1013일, 36021일 등)에도 대응합니다.

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 에서 참조해 주세요.

유틸리티 기능처럼 짧고, 달콤하고, 효율적입니다.부호화/부호화되지 않은 정수/플로트와 함께 작동합니다(플로트를 서수로 만들 필요는 상상할 수 없지만).

뛰어난 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

링크에서 이용할 수 있는 답변을 인용하고 싶습니다.

function ordinal(n) {
  var s = ["th", "st", "nd", "rd"];
  var v = n%100;
  return n + (s[(v-20)%10] || s[v] || s[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'));

10대들의 예외에 주목하세요?10대들은 정말 악랄해!

편집: 11일과 12일을 잊어버렸습니다.

내 물건을 위해 만든 오래된 것...

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

이 함수는 높은 숫자와 모든 테스트 케이스를 위해 작성했습니다.

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

여기 조금 다른 방법이 있습니다(다른 답변에서는 그렇지 않습니다).좋아하는지 싫어하는지는 모르겠지만 효과가 있어!

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

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

이 질문에 대한 기존 답변을 보완하기 위해 기능적인 답변을 제공하고자 합니다.

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)

특별한 값의 배열을 작성했습니다.중요한 것은 배열에 제로 베이스 인덱스가 있기 때문에 서수 서픽스[0]는 'st'와 같다는 것입니다.

우리의 함수 numberToOrdinal은 숫자가 10대 번호로 끝나는지 확인하고, 이 경우 숫자 서수가 모두 'th'이므로 숫자를 'th'로 추가합니다.숫자가 10대가 아닌 경우, 우리는 숫자를 서수에 더하는 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

저는 이것을 강력히 추천합니다, 그것은 매우 쉽고 읽기 쉽습니다.도움이 됐으면 좋겠어요?

  • 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

이것은 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

+be 번호의 다른 옵션은 다음과 같습니다.

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

또, 순서 프레픽스를 삭제하려면 , 다음의 순서를 사용합니다.

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

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

필요에 따라 자유롭게 변경 가능

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

사용할 수 있습니다.

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

접미사를 배치하기 위해

언급URL : https://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number

반응형