Excel, 212 octets
=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)
Si vous le divisez en morceaux à chaque esperluette, vous obtenez ces pièces:
ABS()
extrait le numéro du jour des deux derniers caractères de la chaîne. Comme cela peut inclure un trait d'union, le ABS
convertit en positif.
IF((ABS-12)<2,"th",SWITCH())
ajoute l'ordinal. Le -12
bit est parce que 11, 12 et 13 ne suivent pas la règle normale et ils obtiennent tous th
au lieu de st
,nd
et rd
. Cela corrige cela.
- Remarque: La
SWITCH
fonction est uniquement disponible dans Excel 2016 et versions ultérieures. ( Source ) Il est plus court que CHOOSE
dans ce cas car il peut renvoyer une valeur si aucune correspondance n'est trouvée alors qu'il CHOOSE
nécessite une entrée numérique et doit avoir un retour correspondant pour chaque valeur possible.
TEXT(MID()*30," mmmm ")
extrait le nom du mois. MID()
extrait le numéro du mois sous forme de chaîne et multiplier par 30 renvoie un nombre. Excel voit ce nombre comme une date (1900-01-30, 1900-02-29, 1900-03-30, etc.) et le TEXT()
formate comme un nom de mois avec un espace aux deux extrémités. 28 et 29 auraient également fonctionné mais 30 semble "plus joli".
LEFT()
extrait le numéro de l'année.
Maintenant, étant donné tout cela, il aurait été beaucoup plus facile si les cas de test se trouvaient tous dans une plage de dates qu'Excel peut gérer comme une date réelle: 1900-01-01 à 9999-12-31. Le gros avantage est que la date entière est formatée à la fois. Cette solution est de 133 octets :
=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'autre grand obstacle devait inclure l'ordinal. Sans cela, la solution ne fait que 34 octets :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
au lieu de3rd