Excel, 212 bayt
=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)
Her veda her parçaya ayırırsanız, şu parçaları elde edersiniz:
ABS()dizenin son iki karakterinden gün sayısını alır. Bu bir kısa çizgi içerebileceğinden, ABSpozitif olarak dönüştürür.
IF((ABS-12)<2,"th",SWITCH())ordinal ekler. -1211, 12, ve 13 normal kural uymayan ve hepsi olsun çünkü biraz thyerine st, ndve rd. Bu durumu düzeltir.
- Not:
SWITCHİşlev yalnızca Excel 2016 ve sonraki sürümlerde kullanılabilir. ( Kaynak ) CHOOSEBu durumda olduğundan daha kısadır, çünkü eşleşme bulunmazsa bir değer döndürebilir, oysa CHOOSEsayısal girdi gerektirir ve olası her değer için karşılık gelen bir dönüşe sahip olmalıdır.
TEXT(MID()*30," mmmm ")ay adını ayıklar. MID()ay numarasını bir dize olarak çıkarır ve 30 ile çarpmak bir sayı döndürür. Excel bu sayıyı tarih olarak görür (1900-01-30, 1900-02-29, 1900-03-30, vb.) Ve TEXT()her iki uçta da boşluk olacak şekilde ay adı olarak biçimlendirir. 28 ve 29 da çalışır ama 30 "daha güzel" görünüyor.
LEFT() yıl sayısını çıkarır.
Şimdi, tüm bunlar göz önüne alındığında, test senaryolarının tümü Excel'in gerçek bir tarih olarak işleyebileceği bir tarih aralığında olsaydı daha kolay olurdu: 1900-01-01 ila 9999-12-31. En büyük avantaj, tüm tarihin bir kerede biçimlendirilmiş olmasıdır. Bu çözüm 133 bayttır :
=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")
Diğer büyük engel ordinali eklemek zorundaydı. Bu olmadan, çözüm sadece 34 bayttır :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rdyerine3rd