2012-09-19 12 views

cevap

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

Thanks @RobG bit değiştirilmiş versiyonu

function getOrdinal(n) { 
    if((parseFloat(n) == parseInt(n)) && !isNaN(n)){ 
     var s=["th","st","nd","rd"], 
     v=n%100; 
     return n+(s[(v-20)%10]||s[v]||s[0]); 
    } 
    return n;  
} 

Testler

getOrdinal("test"); // test 
getOrdinal(1.5);  // 1.5 
getOrdinal(1);  // 1st 
getOrdinal(2);  // 2nd 
getOrdinal(3);  // 3rd 
getOrdinal(4);  // 4th 
getOrdinal(true);  // true 
getOrdinal(Infinity); // Infinity 
getOrdinal(NaN);  // NaN 
getOrdinal(void 0); // undefined 
+2

Vay be, ben yanlışlıkla Kod Golf yanılmak mı? :) –

+1

Ayrıca, "1.5", "udnefinedth", "NaN", "trueth" ve "falseth" değerini döndürür. Fonksiyon muhtemelen girişin bir sayı veya uygun bir dizi olduğunu test etmelidir (bir tamsayı olabileceğinden emin olunması yeterlidir). Eğer öyleyse, sayıyı artı sırala. Aksi takdirde, orijinal değeri döndürün. – RobG

+1

Güzel, kompakt bir çözüm :) – sameera207

2

arayabilirsin, böylece o rahat Numara prototip içine fonksiyonu maymun yama bulabilir sayı üzerinde bir yöntem olarak (Pradeep'in cevabından utanmadan çalınan uygulama):

Number.prototype.toOrdinal = function() { 
    var n = this.valueOf(), 
     s = [ 'th', 'st', 'nd', 'rd' ], 
     v = n % 100; 
    return n + (s[(v-20)%10] || s[v] || s[0]) 
} 

Örnek kullanım:

var someDay = Math.floor(Math.random() * 31 + 1); 
alert(someDay.toOrdinal()) 

Yoksa Maymun Yama Evil mı inanıyoruz olabilir; her zamanki gibi, YMMV.

(Bazen bu özel yöntem th diyoruz, ama bu çağrı için parantez gerekmez dilde biraz daha iyi çalışır.)

mantık bir açıklama ekleme. JavaScript özgüdür önemli noktalar:

  1. % operatör olumsuz temettü için olumsuz sonuçlar verir (böylece -1 % 5-1 olan pozitif böleni modulo; 0 ve n-1 arasındaki tek cevaplar modülü operatör getiri diğer birçok uygulamaları, bu yüzden -1 % 5, 'dur).
  2. Dizileri geçerli dizin aralığı dışında bir değere göre indekslemeye çalışmak (ya negatif ya da dizinin sonunu geçmişse), falsey olan undefined değeriyle sonuçlanır.
  3. 01221606a

Mantık bu gerçekleri, bu son bölümleri olan küçük bir ifadeden doğru soneki döndürmek için kullanır.

  1. s[(v-20)%10]. v (verilen sayı modulo 100 olan) 20'den küçükse, dizin negatiftir ve dizi erişimi undefined değerini döndürür. Aksi takdirde, dizi endeksi 0 ile 9 arasındadır. 0'dan 3'e kadar olan değerler, doğru ilişkili son eki ("th", "st", "nd" ve "rd") döndürürken, 3'ten büyük bir şey tekrar undefined değerini döndürür.

  2. 1 sonucu belirli bir değer ise, döndürün; aksi halde s[v]'a erişmeyi deneyin. v'un kendisi 0, 1, 2 veya 3 ise, sırasıyla "th", "st", "nd" veya "rd" harflerini alırız. Aksi halde tanımsız bir değer alırız ve ifade bir sonraki alternatife geçer.

  3. Yukarıdaki sonuçlardan hiçbiri tanımlanmadıysa, "th" olan s[0]'u döndürürüz.11, 12 ve 13 olmak üzere - - girişi 1, 2 veya 3 biten bütün diğer sayılar "st" alırken ", nd bir "th" alır

sonuç 4'ten 20'ye aracılığıyla her şeyin olmasıdır sırasıyla "ve" rd ".

+0

'Number.prototype' 'a eklenmesi, yalnızca gerçekten sayı olan değerlere çağrılmasının yararına sahiptir. Ancak, değerin bir tam sayı olduğunu test etmelidir, aksi halde sıralamayı eklemeyin (ve orijinal değeri geri döndürün?). – RobG

+0

Sadece v değil, v-20'nin neden hızlı bir sorusu var? – Craicerjack

+0

Bunu PradeepSanjaya'nın cevabından kopyaladım, fakat 1, 2 ve 3'te biten sayıların "st", "nd" ve "rd" yi alması gerçeğiyle başa çıkmak için var - 11, 12'de biten rakamlar hariç ve 13, hepsi "th" olsun. –

1

Pradeep'in cevabı havalıdır, ancak biraz daha sağlam olan bir şey değeri test etmeli ve eğer bir değer (örneğin değeri döndürmek gibi) eklemek için uygun bir değer değilse, mantıklı bir şey yapmalıdır. tarayıcı ve düğüm hem de

var getOrdinal = (function() { 

    var re = /^\d+$/; 
    var ordinal = ["th","st","nd","rd"]; 

    return function (value) { 

     var t; 

     if (re.test(String(value))) { 
     t = value % 100; 
     return t + (ordinal[(t - 20 % 10)] || ordinal[t] || 'th');    
     } 

     return value; 
    } 
}()); 

getOrdinal(void 0); // undefined 
getOrdinal(  ); // undefined 
getOrdinal(NaN ); // NaN 
getOrdinal(true ); // true 
getOrdinal(1.0 ); // 1st 
getOrdinal('' ); // '' (empty string) 
getOrdinal(Infinity); // Infinity 
0
npm install ordinal 

eserler. Sonra sadece:

var ordinal = require('ordinal') 

ordinal(1); //=> '1st' 
ordinal(2); //=> '2nd' 
ordinal(3); //=> '3rd' 
ordinal(4); //=> '4th' 

ordinal(11); //=> '11th' 
ordinal(12); //=> '12th' 
ordinal(13); //=> '13th' 

ordinal(21); //=> '21st' 
ordinal(22); //=> '22nd' 
ordinal(23); //=> '23rd' 
ordinal(24); //=> '24th' 

https://www.npmjs.com/package/ordinal

İlgili konular