47
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

通貨のI18nは気をつけた方がいい

Posted at

皆さんはRailsの

number_to_currency

という関数をご存知だろうか?

例えば、あるものの金額が、23654200円だったとする。
まったくもって読みにくい。

これを会計風に表示してくれるのがnumber_to_currencyである。

number_to_currency(23654200)

としてみると、

23,654,200円

と表示してくれる。とても優秀な関数である。

ちなみに、これはデフォルトの設定を以下のように指定しておかないとこういう風にはならないかもしれない。

ja.yml
ja:
  number:
    currency:
      format:
        delimiter: ","
        format: "%n%u"
        precision: 0
        separator: "."
        significant: false
        strip_insignificant_zeros: false
        unit: 

こういった細かいオプションについては

を参照して欲しい。

で、本題。

これの厄介なところは、いざロケールが英語の人が見てみると、この値段は

$23,654,200.00

と表示される。
素晴らしい機能すぎて涙が出る。。。

ja->enの場合は値段が高くなっているので、モノを販売しているときは多分大きなトラブルにはならないと思うが、値段が高くなって困るケースも多々あるはずなので転ばぬ先の杖として以下のように設定しておくと良い。

en.yml
en:
  number:
    currency:
      format:
        delimiter: ","
        format: "%n%u"
        precision: 0
        separator: "."
        significant: false
        strip_insignificant_zeros: false
        unit: " JPY"

もしくは

en.yml
en:
  number:
    currency:
      format:
        delimiter: ","
        format: "%u%n"
        precision: 0
        separator: "."
        significant: false
        strip_insignificant_zeros: false
        unit: "¥"

と設定しておくと安全。
自分は、'¥'と書いてあっても通過単位がわからない人は外国では多いと思うので、ググれる'JPY'の方がいいのではないかと思っている。

ちなみに、ドル払いも可能にするときは、普通に何らかの関数を別途作ったほうが無難だと思う。

本来、localeには、地域と言語の2軸あり、今回の場合の円はどちらかと言うとjpという地域に属するもの。
こういうものは他にもあるかも知れないが、お金の話はセンシティブなので、皆さんもなにか問題になる前に設定を見なおしてみてはいかがでしょう?

47
41
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
47
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?