Excel, 212 byte
=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)
Se lo spezzi in pezzi in ogni e commerciale, ottieni questi pezzi:
ABS()
estrae il numero del giorno dagli ultimi due caratteri nella stringa. Dal momento che può includere un trattino, lo ABS
converte in positivo.
IF((ABS-12)<2,"th",SWITCH())
aggiunge l'ordinale. Il fatto -12
è che 11, 12 e 13 non seguono la regola normale e ottengono tutti th
invece di st
,nd
e rd
. Questo corregge per quello.
- Nota: la
SWITCH
funzione è disponibile solo in Excel 2016 e versioni successive. ( Sorgente ) È più breve che CHOOSE
in questo caso perché può restituire un valore se non viene trovata alcuna corrispondenza, mentre CHOOSE
richiede un input numerico e deve avere un ritorno corrispondente per ogni possibile valore.
TEXT(MID()*30," mmmm ")
estrae il nome del mese. MID()
estrae il numero del mese come stringa e moltiplicandolo per 30 restituisce un numero. Excel vede quel numero come una data (1900-01-30, 1900-02-29, 1900-03-30, ecc.) ETEXT()
formatta come un nome di mese con uno spazio su entrambe le estremità. Anche 28 e 29 avrebbero funzionato, ma 30 sembra "più bello".
LEFT()
estrae il numero dell'anno.
Ora, dato tutto ciò, sarebbe stato molto più semplice se i casi di test fossero tutti in un intervallo di date che Excel può gestire come data effettiva: dal 1900-01-01 al 9999-12-31. Il grande vantaggio è che l'intera data viene formattata contemporaneamente. Tale soluzione è di 133 byte :
=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")
L'altro grande ostacolo doveva includere l'ordinale. Senza questo, la soluzione è di soli 34 byte :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
invece di3rd