Excel, 212 bytes
=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 você o dividir em pedaços a cada e comercial, você obtém as seguintes peças:
ABS()extrai o número do dia dos dois últimos caracteres da sequência. Como isso pode incluir um hífen, ABSconverte-o em positivo.
IF((ABS-12)<2,"th",SWITCH())adiciona o ordinal. O -12bit é porque 11, 12 e 13 não seguem a regra normal e todos eles recebem them vez de st, nde rd. Isso corrige isso.
- Nota: A
SWITCHfunção está disponível apenas no Excel 2016 e posterior. ( Origem ) É mais curto do que CHOOSEneste caso, pois pode retornar um valor se nenhuma correspondência for encontrada, enquanto CHOOSErequer entrada numérica e deve ter um retorno correspondente para cada valor possível.
TEXT(MID()*30," mmmm ")extrai o nome do mês. MID()extrai o número do mês como uma sequência e multiplicar por 30 retorna um número. O Excel vê esse número como uma data (1900-01-30, 1900-02-29, 1900-03-30, etc.) e o TEXT()formata como um nome de mês com um espaço nas duas extremidades. 28 e 29 também teriam obras, mas 30 parecem "mais agradáveis".
LEFT() extrai o número do ano.
Agora, considerando tudo isso, teria sido muito mais fácil se os casos de teste estivessem todos em um período que o Excel possa manipular como uma data real: 1900-01-01 a 9999-12-31. A grande vantagem é que a data inteira é formatada de uma só vez. Essa solução é 133 bytes :
=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")
O outro grande obstáculo foi ter que incluir o ordinal. Sem isso, a solução é de apenas 34 bytes :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rdvez de3rd