2012-09-19 5 views

उत्तर

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

धन्यवाद @RobG बिट संशोधित संस्करण

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

टेस्ट

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

वाह, मैं गलती से कोड गोल्फ में ठोकर किया? :) –

+1

भी '1.5 वें ',' udnefinedth', 'NaNth',' trueth' और' falseth' देता है जो विचित्र हो सकता है लेकिन उपयोगी से कम प्रतीत होता है। फ़ंक्शन को शायद यह जांचना चाहिए कि इनपुट एक संख्या या उपयुक्त स्ट्रिंग है (सुनिश्चित करें कि यह एक पूर्णांक पर्याप्त हो सकता है)। यदि ऐसा है, तो नंबर प्लस ordinal वापस करें। अन्यथा, मूल मान वापस करें। – RobG

+1

अच्छा, कॉम्पैक्ट समाधान :) – sameera207

2

आप, यह सुविधाजनक संख्या प्रोटोटाइप में समारोह बंदर-पैच करने के लिए मिल सकती है ताकि आप इसे कॉल कर सकते हैं संख्या पर एक विधि के रूप में (प्रदीप के जवाब से निर्बाध रूप से चुराया गया कार्यान्वयन):

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

उदाहरण उपयोग:

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

या आपको लगता है कि हो सकता है कि बंदर पट्टी बुराई है; सामान्य रूप से, वाईएमएमवी।

(मैं कभी कभी इस विशेष विधि th फोन है, लेकिन यह कुछ हद तक बेहतर काम करता है भाषाओं जहां मंगलाचरण के लिए कोष्ठक की जरूरत नहीं है में।)

तर्क का एक विवरण जोड़ना। प्रमुख बिंदु है कि कर रहे हैं जावास्क्रिप्ट विशेष:

  1. % ऑपरेटर एक नकारात्मक लाभांश के लिए नकारात्मक परिणाम देता है एक सकारात्मक भाजक सापेक्ष (ताकि -1 % 5-1 है, मापांक ऑपरेटर वापसी 0 और n-1 के बीच केवल जवाब के कई अन्य कार्यान्वयन, इसलिए -1 % 54 है)।
  2. इंडेक्स की वैध सीमा (या तो नकारात्मक या सरणी के अंत से पहले) के बाहर किसी मान द्वारा किसी सरणी को इंडेक्स करने का प्रयास करने से undefined मान होता है, जो गलत है।

तर्क इन तथ्यों का शोषण करने वाली इन भागों के साथ एक कॉम्पैक्ट अभिव्यक्ति से सही प्रत्यय वापस जाने के लिए।

  1. s[(v-20)%10] तक पहुंचने का प्रयास करें। यदि v (जो दिया गया नंबर मॉड्यूलो 100 है) 20 से कम है, तो सूचकांक नकारात्मक है और सरणी पहुंच undefined लौटाती है। अन्यथा, सरणी अनुक्रमणिका 0 और 9 के बीच है। मान 0 से 3 के बीच सही संबंधित प्रत्यय ("वें", "सेंट", "एनडी", और "rd") लौटाता है, जबकि 3 से अधिक कुछ भी undefined वापस लौटाएगा।

  2. यदि 1 का परिणाम परिभाषित मूल्य है, तो इसे वापस करें; अन्यथा, s[v] तक पहुंचने का प्रयास करें। यदि v स्वयं 0, 1, 2, या 3 है, तो हम क्रमशः "वें", "सेंट", "एनडी", या "rd" प्राप्त करते हैं। अन्यथा, हमें एक अपरिभाषित मान मिलता है, और अभिव्यक्ति अगले विकल्प पर जाती है।

  3. यदि उपर्युक्त परिणामों में से कोई भी परिभाषित नहीं किया गया है, तो हम s[0] लौटाते हैं, जो "वें" है।11 12, और 13 सहित, - - एक "वें" हो जाता है, जबकि अन्य सभी नंबर, 1 में समाप्त होने के 2 या 3 मिलता है "सेंट", "nd

नतीजा यह है कि 4 से 20 के माध्यम से सब कुछ है क्रमशः ", और" rd "।

+0

'नंबर.प्रोटोटाइप' में जोड़ना लाभ है कि इसे केवल उन मानों पर बुलाया जाना चाहिए जो वास्तव में संख्याएं हैं। लेकिन यह परीक्षण करना चाहिए कि मान एक पूर्णांक है, अन्यथा ordinal (और मूल मान वापस नहीं?) जोड़ना है। – RobG

+0

मेरे पास एक त्वरित सवाल है कि क्यों 'v-20' और न केवल v? – Craicerjack

+0

मैंने @ प्रदीप संजय के उत्तर से इसकी प्रतिलिपि बनाई, लेकिन यह इस तथ्य से निपटने के लिए है कि 1, 2, और 3 में समाप्त होने वाली संख्याएं "सेंट", "एनडी" और "rd" मिलती हैं - 11, 12 में समाप्त होने वाली संख्याओं को छोड़कर, और 13, जो सभी को "वें" मिलता है। –

1

प्रदीप का जवाब अच्छा है, लेकिन थोड़ा और मजबूत कुछ मूल्य का परीक्षण करना चाहिए और कुछ समझदार होना चाहिए यदि यह एक ordinal जोड़ने के लिए उपयुक्त मूल्य नहीं है (जैसे मूल्य वापस करें), उदा। दोनों ब्राउज़र और नोड में

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 

काम करता है। तो बस:

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

संबंधित मुद्दे