MTで税込み計算&3桁ごとにコンマで区切る&切り捨てなど

mixiのMTのコミュニティで、以下のような質問を見かけました。

  • MT4.2のカスタムフィールド(MTsale)を使用。
  • 入力された金額に1.05をかけて税込表示にしたい。
  • 入力される金額は3桁ごとに,区切りで、出力も同じように3桁で,区切りにしたい。 入力例. 1,999
  • 出力はphp等で動的に変換せず、静的な数字としてhtmlを出力したい。

この質問に答えてみます。

1.フィールドの値を1.05倍する

質問された方は、フィールドの値からコンマを除いて1.05倍する方法として、以下のタグをあげていました。
ただ、この方法ではうまくいかなかったとのことです。

<$MTsale replace=",","" setvar="sale"$>
<$MTVar name="sale" value="1.05" op="*"$>

しかし、当方で試した限りでは、この書き方で問題なく動作しました。
「カスタムフィールドに数値が全角で入力されている」「コンマではなくピリオドで区切られて入力されている」など、入力されている値に何か問題があるのではないかと思います。

2.数値を3桁ごとにコンマで区切る

Movable Type 4.2以降では、「numify」というグローバルモディファイアが追加されています。
このモディファイアは、数値を3桁ごとにコンマ等で区切って出力する働きをします。

前述の消費税計算と組み合わせると、以下のようなタグの組み方が考えられます。

<$mt:Sale replace=",","" setvar="sale"$>
<mt:SetVar name="sale" value="1.05" op="*">
<mt:GetVar name="sale" numify="1">

3.切り捨て

消費税を計算すると、小数点以下の値が出ることもあります。
そこで、小数点以下を切り捨てる方法も紹介します。

MTタグだけで行うとすれば、正規表現を使って、小数点(.)から後の文字を削除する、という手法が考えられます。
変数saleの小数点以下を切り捨てて、変数sale_dに代入するとすれば、以下のように書くことができます。

<mt:SetVar name="sale_d" value="$sale">
<mt:GetVar name="sale_d" regex_replace="/(\d*)\.(\d*)/","$1" setvar="sale_d">

4.四捨五入

四捨五入は、「元の値に0.5を足して、小数点以下を切り捨てる」という方法で行うことができます。
変数saleの小数点以下を四捨五入して、変数sale_rに代入するとすれば、以下のように書くことができます。

<mt:SetVar name="sale_r" value="$sale">
<mt:SetVar name="sale_r" value="0.5" op="+">
<mt:GetVar name="sale_r" regex_replace="/(\d*)\.(\d*)/","$1" setvar="sale_r">

5.切り上げ

切り上げはやや面倒です。
ここでは、以下のような考え方をすることにします。

  • 1.切り上げる元の数値を、いったん切り捨てる
  • 2.1.で求めた数値と元の数値を比較する
  • 3.2.で両者が同じなら、元の数値に小数点以下がなかったので、元の数値をそのまま使う
  • 4.2.で両者が異なるなら、元の数値に小数点以下があったので、切り捨てた数値に1を足した値を使う

変数saleの小数点以下を切り挙げて、変数sale_uに代入するとすれば、以下のように書くことができます。

<mt:SetVar name="sale_u" value="$sale">
<mt:GetVar name="sale_u" regex_replace="/(\d*)\.(\d*)/","$1" setvar="sale_u">
<mt:Unless name="sale_u" eq="$sale">
<mt:SetVar name="sale_u" value="1" op="+">
</mt:Unless>