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)
Wenn Sie es bei jedem kaufmännischen Und in Stücke teilen, erhalten Sie die folgenden Teile:
ABS()
Ruft die Tageszahl aus den letzten beiden Zeichen der Zeichenfolge ab. Da dies einen Bindestrich enthalten kann, ABS
wird dieser in einen positiven umgewandelt.
IF((ABS-12)<2,"th",SWITCH())
fügt die Ordnungszahl hinzu. Das -12
Bit ist , weil 11, 12 und 13 nicht der normale Regel folgen und sie alle bekommen th
statt st
, nd
und rd
. Das korrigiert das.
- Hinweis: Die
SWITCH
Funktion ist nur in Excel 2016 und höher verfügbar. ( Quelle ) Es ist kürzer als CHOOSE
in diesem Fall, da es einen Wert zurückgeben kann, wenn keine Übereinstimmung gefunden wird, während CHOOSE
eine numerische Eingabe erforderlich ist und für jeden möglichen Wert eine entsprechende Rückgabe erfolgen muss.
TEXT(MID()*30," mmmm ")
extrahiert den Monatsnamen. MID()
Zieht die Monatszahl als String heraus und multipliziert mit 30 ergibt sich eine Zahl. Excel sieht diese Zahl als Datum (1900-01-30, 1900-02-29, 1900-03-30 usw.) und TEXT()
formatiert sie als Monatsnamen mit einem Leerzeichen an beiden Enden. 28 und 29 hätten auch geklappt aber 30 sieht "schöner" aus.
LEFT()
extrahiert die Jahreszahl.
Angesichts dessen wäre es jetzt viel einfacher gewesen, wenn die Testfälle alle in einem Datumsbereich lagen, den Excel als aktuelles Datum behandeln kann: 1900-01-01 bis 9999-12-31. Der große Vorteil ist, dass das gesamte Datum auf einmal formatiert wird. Diese Lösung ist 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")
Die andere große Hürde bestand darin, die Ordnungszahl aufzunehmen. Ohne das ist die Lösung nur 34 Bytes :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
statt3rd