JavaScriptで英語の序数(st, nd, rd, th)を付ける関数の作成方法

序数(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関数を実行して表示するサンプル