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 ABSconverte 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 thinvece di st,nd e rd. Questo corregge per quello.
- Nota: la
SWITCHfunzione è disponibile solo in Excel 2016 e versioni successive. ( Sorgente ) È più breve che CHOOSEin questo caso perché può restituire un valore se non viene trovata alcuna corrispondenza, mentre CHOOSErichiede 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")
03rdinvece di3rd