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()
文字列の最後の2文字から日番号を取得します。ハイフンが含まれている可能性があるため、ABS
それを正に変換します。
IF((ABS-12)<2,"th",SWITCH())
序数を追加します。-12
11、12、および13は、通常のルールに従わないと、彼らはすべてを得るためのビットがあるth
代わりにst
、nd
とrd
。これはそれを修正します。
- 注:この
SWITCH
機能は、Excel 2016以降でのみ使用できます。(Source)数値入力を必要とし、可能な値ごとに対応する戻り値が必要なCHOOSE
のに、一致が見つからない場合に値を返すことができるため、この場合よりも短くCHOOSE
なります。
TEXT(MID()*30," mmmm ")
月名を抽出します。MID()
月番号を文字列として引き出し、30を掛けると数値が返されます。Excelが日付としてその数を見ている(1900年1月30日、1900年2月29日、1900年3月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")
もう1つの大きなハードルは、序数を含める必要がありました。それがなければ、ソリューションはわずか34バイトです:
=TEXT(DATEVALUE(A1),"d mmmm yyyy")
03rd
代わりに3rd