Excel, 212 bajtów
=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)
Jeśli podzielisz go na kawałki na każdym znaku handlowego, otrzymasz następujące elementy:
ABS()
pobiera liczbę dni z dwóch ostatnich znaków w ciągu. Ponieważ może zawierać łącznik, ABS
konwertuje go na dodatni.
IF((ABS-12)<2,"th",SWITCH())
dodaje porządek. -12
Nieco dlatego, 11, 12 i 13 nie stosują normalnej regułę i oni wszyscy się th
zamiast st
, nd
i rd
. To poprawia to.
- Uwaga:
SWITCH
funkcja jest dostępna tylko w programie Excel 2016 i nowszych. ( Źródło ) Jest krótszy niż CHOOSE
w tym przypadku, ponieważ może zwrócić wartość, jeśli nie zostanie znalezione dopasowanie, podczas gdy CHOOSE
wymaga wprowadzania danych liczbowych i musi mieć odpowiedni zwrot dla każdej możliwej wartości.
TEXT(MID()*30," mmmm ")
wyodrębnia nazwę miesiąca. MID()
wyciąga liczbę miesięcy jako ciąg znaków i pomnożenie przez 30 zwraca liczbę. Excel widzi tę liczbę jako datę (1900-01-30, 1900-02-29, 1900-03-30 itd.) I TEXT()
formatuje ją jako nazwę miesiąca ze spacją na obu końcach. 28 i 29 też by działały, ale 30 wygląda „ładniej”.
LEFT()
wyodrębnia numer roku.
Biorąc to wszystko pod uwagę, byłoby znacznie łatwiej, gdyby wszystkie przypadki testowe znajdowały się w zakresie dat, który Excel może obsłużyć jako rzeczywistą datę: od 1900-01-01 do 9999-12-31. Dużą zaletą jest to, że cała data jest formatowana jednocześnie. To rozwiązanie ma 133 bajty :
=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")
Inną dużą przeszkodą było uwzględnienie porządkowej. Bez tego rozwiązanie ma tylko 34 bajty :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
zamiast3rd