Excel, 212 байт
=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)
Якщо ви розбиваєте його на шматки на кожній амперсанді, ви отримуєте ці шматки:
ABS()
витягує число дня з двох останніх символів у рядку. Оскільки ця може включати дефіс, ABS
перетворює її на позитивну.
IF((ABS-12)<2,"th",SWITCH())
додає порядковий. -12
Біт , тому що 11, 12 і 13 не слід нормальному правилом , і всі вони отримують th
замість st
, nd
іrd
. Це виправляє це.
- Примітка. Ця
SWITCH
функція доступна лише в Excel 2016 та пізніших версіях. ( Джерело ) Це коротше, ніж CHOOSE
у цьому випадку, оскільки воно може повернути значення, якщо не знайдено відповідності, тоді як CHOOSE
потрібне числове введення та повинно мати відповідне повернення для кожного можливого значення.
TEXT(MID()*30," mmmm ")
витягує назву місяця. MID()
витягує число місяця у вигляді рядка і множачи на 30 повертає число. Excel розглядає це число як дату (1900-01-30, 1900-02-29, 1900-03-30 тощо) і TEXT()
форматує його як ім'я місяця з пробілом на обох кінцях. 28 і 29 також працювали б, але 30 виглядає "приємніше".
LEFT()
витягує номер року.
Тепер, враховуючи все це, було б набагато простіше, якби всі тестові випадки були у діапазоні дат, який Excel може обробляти як фактичну дату: 1900-01-01 - 9999-12-31. Великою перевагою є те, що вся дата форматується одразу. Це рішення становить 133 байти :
=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")
Інша велика перешкода повинна була включати порядковий номер. Без цього рішення становить всього 34 байти :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
замість3rd