序数(st, nd, rd, th)を付ける関数
Webサイトの作成時に引数に数値(数字)を入れたら英語の序数(st, nd, rd, th)を語尾に付けて返す関数がほしいことがある。
Rubyだとordinalizeメソッドを使用すれば簡単に付与できるが、JavaScriptはそのようなメソッドは存在しないため、自分で関数を作成する必要がある。
序数(st, nd, rd, th)を付けるルール
Wikipediaによると英語の序数詞のルールは下記のようになっている。
one -> first、two -> second、three -> thirdのように3までは基数詞と序数詞で異なる単語を用いている(補充形、不規則変化)が、4以降は10まで基数詞に接尾辞"-th"を付けて序数詞を表す(規則的)。
2桁以上の場合は下1桁(一の位)に従う(即ち、一の位が1から3以外ならば"-th")が、11から19は一つの単語の表現としてあるため、一律で"-th"を用いる。例えば、「13」を意味する"thirteen"に対し「13番目」は"-th"を用いて"thirteenth"となるが、「21」を意味する"twenty-one"に対し「21番目」は一の位に従い"twenty-first"という風になる。これを"twenty-oneth"とするのは誤りであるが、英語文化圏においても誤記されることがままある。
このルールは英語文化圏においても誤記されることがあり、日本人で序数を付ける関数を作成している人は結構いたが、間違えて書いている人も多かった。
特に3桁以上の102を102ndではなく102thと返す間違えが多い。
序数(st, nd, rd, th)を付ける関数作成
前述のルールを元にJavaScriptの関数を作成すると下記のようになる。
('' + n).slice(-1)で下1桁、('' + n).slice(-2)で下2桁の文字列を取得して、1: st, 2: nd, 3: rd、11〜13および1, 2, 3以外はthを返す。
これなら102などが入っても102thではなく102ndと正しく返すことができる。
function ordinal(n) { var result; var s1 = +('' + n).slice(-1); var s2 = +('' + n).slice(-2); if (s2 >= 11 && s2 <= 13) { result = n + 'th'; } else if (s1 === 1) { result = n + 'st'; } else if (s1 === 2) { result = n + 'nd'; } else if (s1 === 3) { result = n + 'rd'; } else { result = n + 'th'; } return result; }
1から123までordinal関数を実行して表示するサンプル