Shopifyの価格出力時の桁数と扱い方に関して

Shopifyは日本の習慣を前提に考えすぎると想定外の状況に陥ることがあります。特に価格の出力に関しては遭遇しやすい問題かもしれないので、推測を含んでいますがメモ的に記事にしたいと思います。

[追記:2012.4.9]
内容に間違いがあったので全体的に直しています。

Shopifyの価格の出力

{{ product.price }}などで価格を出力すると以下のようになります。

  • 100円の商品が10000と2桁多い状態で出力される

このことから、分岐に用いる場合には以下のように0を二つ追加して書く必要があります。


{% assign price = product.price %}
{% if price >= 100000 and price < 1000000 %}
  1,000円以上なので送料半額です。
{% elsif price >= 1000000 %}
  10,000円以上なので送料無料です。
{% else %}
  1,000円未満なので通常の送料が必要です。
{% endif %}

money_without_currencyを使う方法

あるいはmoney_without_currencyを使った方法も検討できるかもしれません。
ただし日本円以外では動作未確認の上、検討しなければならない事項がありますが。


{% assign price = product.price | money_without_currency | remove: ',' | plus:0 %}
{% if price >= 1000 and price < 10000 %}
  1,000円以上なので送料半額です。
{% elsif price >= 10000 %}
  10,000円以上なので送料無料です。
{% else %}
  1,000円未満なので通常の送料が必要です。
{% endif %}

流れとしては以下のようなものとなります。

  1. money_without_currencyで通貨の補助単位部分を小数点に切り替える(数値ではなく桁区切り記号が入った文字列として出力される)
  2. 桁数を表す,removeフィルターで消す
  3. 文字列を数値に戻すためにplus:0を用いる

通貨によるカンマとピリオドの区切り記号の違い

  • $1,000.25(1000ドル25セント)
  • ₽1.000,25(1000ルーブル25カペイカ)

少々自信がありませんが、上記のように通貨ごとに桁と小数点の区切り記号の,.が逆転しています。

そのため、通貨によってはremove: '.'の後にreplace: ',' , '.';で通貨ではなく数値の小数点に変更する必要があるように思います(未検証)。

可能なら通貨を判定して処理を加えたり、Moneyフィルター適用直後の段階で消すべき記号を判断したりと、自動化する必要があるでしょう。

単に表示するだけなら、このような手間を考えなくてもShopify側のシステム内で処理してくれるので問題ありません。しかし数値として大小を比較する必要がある場合には、moneyフィルターを使う方法はあまり現実的ではないように思います。

出力値の意味と利用方法の検討

そもそも100円の商品が10000と出力されるのには理由があるはずです。Shopifyが日本で生まれた日本のためのサービスではないことを考えれば、以下のように推測できます。

  • ドルに対するセントのように補助単位をもつ通貨が基本となっている(日本では円に対する銭が一応該当)
  • 様々な進法に基づく補助単位を含めて価格を扱う必要があるため、基本の状態としては、通貨単位の末尾に補助単位を2桁で加えた数値として用いている

少々ややこしいですが、ドルとセントで言えば、ドルは整数値でセントは小数点以下2桁で表されますので、この少数点をとることで(=補助単位を2桁分の数値としてドルの末尾に追加した状態)、ドル以外の補助単位を持つどの通貨であっても、価格を数値として扱うことが可能になる、ということだと思います。

調べていないので根拠はありませんが、状況的にむしろこの形が基本ではとも思えます。

money_without_currencyの動作

money_without_currency

Formats the price using a decimal.

上記のように書かれており10進法への変換が行われています。

前項を踏まえれば、補助単位はいわば100進法のようなものと考えられますので(100セント=1ドルなので便宜上100進法と記載)、100進法を10進法に直すことで通貨単位のドル表示(セントを小数点以下で表記)に戻すことができる。ということだと思います。

結び

100円を10000円のように書かねばならないと考えると意味がわからないと思いますが、一つ細かい単位の銭に直して10000銭と書く必要がある、と考えると納得しやすいのではないでしょうか。

ちなみにこの件に関してフォーラムに回答したことがありますので一応記載しておきます。

4人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄