LoginSignup
8
7

More than 5 years have passed since last update.

Playframework の I18N で 1st, 2nd, 3rd, 4th, ...

Last updated at Posted at 2014-09-17

conf/messages を書くときに、引数が 1 なら 1st, 2 なら 2nd, 3 なら 3rd, 4 なら 4th を出したい。

何もしなかった例

ranking={0}th

これでは 1th, 2th, 3th, 4th, になる。

解決法

Play の I18N は java.text.MessageFormat を内部で使っているので、choice パターンを使うことができる。

ranking={0,choice,1#1st|2#2nd|3#3rd|3<{0,number,integer}th}

これで 1st, 2nd, 3rd, 4th, 5th, ... となる。

パターンの解釈

  • { パターン開始
  • 0, 最初の引数を対象にする
  • choice, 次の選択肢から選ぶ
  • 1#1st 引数が 1 なら 1st
  • |2#2nd または引数が 2 なら 2nd
  • |3#3rd または引数が 3 なら 3rd
  • |3<{0,number,integer}th または引数が3より大きいなら、最初の引数を整数としてフォーマットして th をつけたもの
  • } パターン終了

どのパターンにも当てはまらない場合にどうなるか気になる。
choice を指定した場合にはフォーマッタとして java.text.ChoiceFormat が使われる。 ChoiceFormat には次のように書かれているので、きっとこれと同じ挙動だろう。

一致するものがない場合、数値 (X) が小さすぎるのか大きすぎるのかによって、最初または最後のインデックスが使用されます。

上で挙げたパターンに対して 0 を引数に与えると、最初のパターンより小さいので 1st が返される。

上記解決法がダメな場合

さて、既にお気づきだと思うが、20th までは大丈夫なものの 21st が望み通りに出せない。22nd, 23rd しかり。全パターンを書き出すことは不可能(無限)。

与えられる数の上限が決まっている場合や、ある程度大きい数の場合には後置文字列が間違ってても気にしない場合には使える。

もっと素敵な解決法はきっと誰かがコメントに書いてくれるだろう。
(すみません。書いてください。おねがいします。)

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7