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, ABS
converte-o em positivo.
IF((ABS-12)<2,"th",SWITCH())
adiciona o ordinal. O -12
bit é porque 11, 12 e 13 não seguem a regra normal e todos eles recebem th
em vez de st
, nd
e rd
. Isso corrige isso.
- Nota: A
SWITCH
função está disponível apenas no Excel 2016 e posterior. ( Origem ) É mais curto do que CHOOSE
neste caso, pois pode retornar um valor se nenhuma correspondência for encontrada, enquanto CHOOSE
requer 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")
03rd
vez de3rd