Excel, 212 byte
=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)
Jika Anda memecahnya menjadi potongan-potongan di setiap ampersand, Anda mendapatkan potongan-potongan ini:
ABS()
menarik nomor hari dari dua karakter terakhir dalam string. Karena itu mungkin termasuk tanda hubung, ABS
mengubahnya menjadi positif.
IF((ABS-12)<2,"th",SWITCH())
tambah ordinal. The -12
bit adalah karena 11, 12, dan 13 tidak mengikuti aturan yang normal dan mereka semua mendapatkan th
bukan st
, nd
, dan rd
. Ini mengoreksi untuk itu.
- Catatan:
SWITCH
Fungsi ini hanya tersedia di Excel 2016 dan yang lebih baru. ( Sumber ) Lebih pendek daripada CHOOSE
dalam kasus ini karena dapat mengembalikan nilai jika tidak ada kecocokan yang ditemukan sedangkan CHOOSE
memerlukan input numerik dan harus memiliki pengembalian yang sesuai untuk setiap nilai yang mungkin.
TEXT(MID()*30," mmmm ")
ekstrak nama bulan. MID()
mengeluarkan angka bulan sebagai string dan mengalikannya dengan 30 mengembalikan angka. Excel melihat angka itu sebagai tanggal (1900-01-30, 1900-02-29, 1900-03-30, dll.) Dan TEXT()
memformatnya sebagai nama bulan dengan spasi di kedua ujungnya. 28 dan 29 juga berfungsi tetapi 30 terlihat "lebih bagus".
LEFT()
ekstrak nomor tahun.
Sekarang, mengingat semua itu, akan jauh lebih mudah jika kasus uji semua dalam rentang tanggal yang dapat ditangani Excel sebagai tanggal aktual: 1900-01-01 hingga 9999-12-31. Keuntungan besar adalah bahwa seluruh tanggal diformat sekaligus. Solusi itu adalah 133 byte :
=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")
Rintangan besar lainnya adalah harus memasukkan ordinal. Tanpa itu, solusinya hanya 34 byte :
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
bukannya3rd