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, ABS
pozitif olarak dönüştürür.
IF((ABS-12)<2,"th",SWITCH())
ordinal ekler. -12
11, 12, ve 13 normal kural uymayan ve hepsi olsun çünkü biraz th
yerine st
, nd
ve rd
. Bu durumu düzeltir.
- Not:
SWITCH
İşlev yalnızca Excel 2016 ve sonraki sürümlerde kullanılabilir. ( Kaynak ) CHOOSE
Bu durumda olduğundan daha kısadır, çünkü eşleşme bulunmazsa bir değer döndürebilir, oysa CHOOSE
sayı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")
03rd
yerine3rd