プログラムで、英語で「3番目の値」「5番目の値」などと出力したい場合、「"the " + n.toString() + "th value"」のように書きますよね。 ただこの場合、「1th」(1stが正しい)、「23th」(23rdが正しい)、のようにおかしいパターンが生じてしまいます。 こういうとき、みなさんならどう解決します?
— くいなちゃん (@kuina_ch) September 28, 2019
JavaScript ではIntl.PluralRules
を使うといいかと思います。
Intl.PluralRules.prototype.select
メソッドは、数値を引数に取り、言語に応じたその数値のカテゴリ("zero", "one", "two", "few", "many","other")を返します。たとえば英語では、1は"one"、11は"other"が返ってきます。
「1は"st"だけど11は"th"」のような処理の部分を、「"one"は"st"、"other"は"th"」のように簡略化できます。
サンプル
const pluralRules = new Intl.PluralRules('en-US', { type: 'ordinal' });
const ordinalRules = { other:'th', one:'st', two:'nd', few:'rd' }
const ordinal = n => n + ordinalRules[ pluralRules.select(n) ];
ordinal(1); //1st
ordinal(2); //2nd
ordinal(3); //3rd
ordinal(4); //4th
ordinal(11); //11th
ordinal(21); //21st
参考:
Intl.PluralRules - JavaScript | MDN
cldr-numbers-full/numbers.json at master · unicode-cldr/cldr-numbers-full · GitHub