Excel, 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 ส่งคืนตัวเลข Excel เห็นตัวเลขนั้นเป็นวันที่(1900-01-30, 1900-02-29, 1900-03-30 ฯลฯ )และจัดTEXT()รูปแบบเป็นชื่อเดือนที่มีช่องว่างทั้งสองด้าน 28 และ 29 จะใช้งานได้ แต่ 30 หน้าจะดูดีกว่า
LEFT() แยกจำนวนปี
ตอนนี้ให้ทุกอย่างมันจะง่ายขึ้นถ้ากรณีทดสอบทั้งหมดอยู่ในช่วงวันที่ที่ Excel สามารถจัดการเป็นวันที่จริง: 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