एक्सेल, 212 बाइट्स
=ABS(RIGHT(A1,2))&IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th"))&TEXT(MID(A1,FIND("-",A1)+1,FIND("-",REPLACE(A1,1,FIND("-",A1),""))-1)*30," mmmm ")&LEFT(A1,FIND("-",A1)-1)
यदि आप इसे प्रत्येक एम्परसेंड में विखंडू में तोड़ते हैं, तो आपको ये टुकड़े मिलते हैं:
ABS()
स्ट्रिंग में अंतिम दो वर्णों से दिन संख्या खींचता है। चूँकि इसमें एक हाइफ़न शामिल हो सकता है, ABS
इसे धनात्मक में परिवर्तित करता है।
IF((ABS-12)<2,"th",SWITCH())
क्रमिक जोड़ता है। -12
बिट है, क्योंकि 11, 12, और 13 सामान्य नियम का पालन नहीं करते और वे सब मिल th
के बजाय st
, nd
, और rd
। इसके लिए यह सही है।
- नोट:
SWITCH
फ़ंक्शन केवल Excel 2016 और बाद में उपलब्ध है। ( स्रोत ) यह CHOOSE
इस मामले की तुलना में छोटा है क्योंकि यह कोई मान वापस कर सकता है यदि कोई मैच नहीं मिला है जबकि CHOOSE
संख्यात्मक इनपुट की आवश्यकता होती है और प्रत्येक संभावित मूल्य के लिए एक ही रिटर्न होना चाहिए।
TEXT(MID()*30," mmmm ")
महीने का नाम निकालता है। MID()
महीने की संख्या को एक स्ट्रिंग के रूप में बाहर निकालता है और एक संख्या को 30 से गुणा करता है। एक्सेल उस संख्या को एक तारीख (1900-01-30, 1900-02-29, 1900-03-30, आदि) के रूप में देखता है और TEXT()
इसे दोनों छोरों पर एक स्थान के साथ एक महीने के नाम के रूप में प्रारूपित करता है। 28 और 29 को भी काम किया होगा लेकिन 30 "अच्छे" लग रहे हैं।
LEFT()
वर्ष संख्या निकालता है।
अब, यह सब देखते हुए, यह आसान होता अगर परीक्षण के मामले सभी तिथि सीमा में होते जो एक्सेल एक वास्तविक तारीख: 1900-01-01 से 9999-12-31 के रूप में संभाल सकता है। बड़ा फायदा यह है कि पूरी तारीख एक ही बार में स्वरूपित की जाती है। वह समाधान 133 बाइट्स है :
=TEXT(DATEVALUE(A1),"d""" & IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th")) & """ mmmm yyyy")
अन्य बड़ी बाधा को अध्यादेश में शामिल करना था। इसके बिना, समाधान सिर्फ 34 बाइट्स है :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
बजाय3rd