में परिवर्तित करें क्या कोई जावास्क्रिप्ट कोड स्निपेट 1-31 का मान लेने और इसे 1, 2, 3, आदि में परिवर्तित करने के लिए है?एक मान 1-31 लें और इसे सामान्य दिनांक w/जावास्क्रिप्ट
धन्यवाद!
में परिवर्तित करें क्या कोई जावास्क्रिप्ट कोड स्निपेट 1-31 का मान लेने और इसे 1, 2, 3, आदि में परिवर्तित करने के लिए है?एक मान 1-31 लें और इसे सामान्य दिनांक w/जावास्क्रिप्ट
धन्यवाद!
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
आप, यह सुविधाजनक संख्या प्रोटोटाइप में समारोह बंदर-पैच करने के लिए मिल सकती है ताकि आप इसे कॉल कर सकते हैं संख्या पर एक विधि के रूप में (प्रदीप के जवाब से निर्बाध रूप से चुराया गया कार्यान्वयन):
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 % 5
-1
है, मापांक ऑपरेटर वापसी 0
और n-1
के बीच केवल जवाब के कई अन्य कार्यान्वयन, इसलिए -1 % 5
4
है)।undefined
मान होता है, जो गलत है।तर्क इन तथ्यों का शोषण करने वाली इन भागों के साथ एक कॉम्पैक्ट अभिव्यक्ति से सही प्रत्यय वापस जाने के लिए।
s[(v-20)%10]
तक पहुंचने का प्रयास करें। यदि v
(जो दिया गया नंबर मॉड्यूलो 100 है) 20 से कम है, तो सूचकांक नकारात्मक है और सरणी पहुंच undefined
लौटाती है। अन्यथा, सरणी अनुक्रमणिका 0 और 9 के बीच है। मान 0 से 3 के बीच सही संबंधित प्रत्यय ("वें", "सेंट", "एनडी", और "rd") लौटाता है, जबकि 3 से अधिक कुछ भी undefined
वापस लौटाएगा।
यदि 1 का परिणाम परिभाषित मूल्य है, तो इसे वापस करें; अन्यथा, s[v]
तक पहुंचने का प्रयास करें। यदि v
स्वयं 0, 1, 2, या 3 है, तो हम क्रमशः "वें", "सेंट", "एनडी", या "rd" प्राप्त करते हैं। अन्यथा, हमें एक अपरिभाषित मान मिलता है, और अभिव्यक्ति अगले विकल्प पर जाती है।
यदि उपर्युक्त परिणामों में से कोई भी परिभाषित नहीं किया गया है, तो हम s[0]
लौटाते हैं, जो "वें" है।11 12, और 13 सहित, - - एक "वें" हो जाता है, जबकि अन्य सभी नंबर, 1 में समाप्त होने के 2 या 3 मिलता है "सेंट", "nd
नतीजा यह है कि 4 से 20 के माध्यम से सब कुछ है क्रमशः ", और" rd "।
'नंबर.प्रोटोटाइप' में जोड़ना लाभ है कि इसे केवल उन मानों पर बुलाया जाना चाहिए जो वास्तव में संख्याएं हैं। लेकिन यह परीक्षण करना चाहिए कि मान एक पूर्णांक है, अन्यथा ordinal (और मूल मान वापस नहीं?) जोड़ना है। – RobG
मेरे पास एक त्वरित सवाल है कि क्यों 'v-20' और न केवल v? – Craicerjack
मैंने @ प्रदीप संजय के उत्तर से इसकी प्रतिलिपि बनाई, लेकिन यह इस तथ्य से निपटने के लिए है कि 1, 2, और 3 में समाप्त होने वाली संख्याएं "सेंट", "एनडी" और "rd" मिलती हैं - 11, 12 में समाप्त होने वाली संख्याओं को छोड़कर, और 13, जो सभी को "वें" मिलता है। –
प्रदीप का जवाब अच्छा है, लेकिन थोड़ा और मजबूत कुछ मूल्य का परीक्षण करना चाहिए और कुछ समझदार होना चाहिए यदि यह एक 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
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'
वाह, मैं गलती से कोड गोल्फ में ठोकर किया? :) –
भी '1.5 वें ',' udnefinedth', 'NaNth',' trueth' और' falseth' देता है जो विचित्र हो सकता है लेकिन उपयोगी से कम प्रतीत होता है। फ़ंक्शन को शायद यह जांचना चाहिए कि इनपुट एक संख्या या उपयुक्त स्ट्रिंग है (सुनिश्चित करें कि यह एक पूर्णांक पर्याप्त हो सकता है)। यदि ऐसा है, तो नंबर प्लस ordinal वापस करें। अन्यथा, मूल मान वापस करें। – RobG
अच्छा, कॉम्पैक्ट समाधान :) – sameera207