見出し画像

PowerCMS X で四則計算(足し算、引き算、掛け算、割り算)、四捨五入

PowerCMS X で四則計算する場合は op モディファイアを利用するのが一般的です。

ただし、公式ドキュメントにサンプルコードがないので分かりにくいですよね。
以下のコードをコピペして動作を見てください。

足し算

<mt:var name="num_a" value="1">
<mt:var name="num_b" value="2">
<mt:var name="num_a" op="+" value="$num_b">
<mt:var name="num_a">

結果
3

引き算

<mt:var name="num_a" value="5">
<mt:var name="num_b" value="3">
<mt:var name="num_a" op="-" value="$num_b">
<mt:var name="num_a">

結果
2

掛け算

<mt:var name="num_a" value="5">
<mt:var name="num_b" value="3">
<mt:var name="num_a" op="*" value="$num_b">
<mt:var name="num_a">

結果
15

割り算

<mt:var name="num_a" value="5">
<mt:var name="num_b" value="3">
<mt:var name="num_a" op="/" value="$num_b">
<mt:var name="num_a">

結果
1.6666666666667

結果の小数点を四捨五入

結果が小数点の場合に PowerCMS X はPHPの round()(四捨五入)、ceil()(切り上げ)、floor(切り捨て)を用意していないので、その辺りは使えません。
以下のコードを試してみてください。

<mt:var name="num_a" value="1.6666666666667">
<mt:var name="num_a" op="+" value="0.05">
<mt:var name="pattern" value="/(\d+)\.(\d)(\d+)/">
<mt:var name="replacement" value="\$1.\$2">
<mt:var name="num_a" regex_replace="'$pattern','$replacement'">

結果
1.7

上記のコードは 1.6666666666667 の数値を小数第二位で四捨五入した計算コードです。
二行目が四捨五入するために 0.05 を加算しています。
3行目(検索文字)、4行目(置換文字)は、5行目で処理するための前準備となり、5行目で regex_replace を使って小数点第二位以下を消し込みます。
正規表現の理解が必要になりますが、複雑なことはしていないです。

3行目(検索文字)、4行目(置換文字)は PowerCMS X の仕様で作る必要があります。直接5行目に書かずに習慣付けたほうが良いですね。
後方参照の $1 は PowerCMS X だと \$1 の記述になります。ご注意ください。

小数点第一位で四捨五入するなら、value="0.05" を value="0.5" にして、value="\$1.\$2" を value="\$1" にすれば動きます。

3つ以上の値で計算する

1 + 2 + 3 の計算は op モディファイアだと 2つまでしか計算できないので、3つ以上の値がある時は mt:math を使います。

<mt:var name="total" value="0">
<mt:var name="num_a" value="1">
<mt:var name="num_b" value="2">
<mt:var name="num_c" value="3">
<mt:math eq="a + b + c" a="$num_a" b="$num_b" c="$num_c" setvar="total">
<mt:var name="total">

結果
6

このコードで注目すべきは <mt:var name="total" value="0"> です。
最後の計算で setvar="total" を指定しますが、total の初期値が空だと計算されません。必ず初期値として 0 をセットしておきましょう。

mt:math は見ての通りですが、計算式を「eq="a + b + c"」として、その隣に「a="$num_a"」というように値をセットします。
「eq="a + b + c"」「a="$num_a"」は「eq="x + y + z"」「x="$num_a"」でも動きますので自由に設定してください。

(( a + b ) / c ) というようにカッコを含めることもできます。以下の場合はカッコがないと結果は7ですが、カッコを付けると結果は6です。

<mt:var name="total" value="0">
<mt:var name="num_a" value="2">
<mt:var name="num_b" value="10">
<mt:var name="num_c" value="2">
<mt:math eq="(( a + b ) / c )" a="$num_a" b="$num_b" c="$num_c" setvar="total">
<mt:var name="total">

結果
6

値は多くても動作します。

<mt:var name="total" value="0">
<mt:var name="num_a" value="1">
<mt:var name="num_b" value="2">
<mt:var name="num_c" value="3">
<mt:var name="num_d" value="4">
<mt:var name="num_e" value="5">
<mt:var name="num_f" value="6">
<mt:var name="num_g" value="7">
<mt:var name="num_h" value="8">
<mt:var name="num_i" value="9">
<mt:var name="num_j" value="10">
<mt:math eq="a + b + c + d + e + f + g + h + i + j" a="$num_a" b="$num_b" c="$num_c" d="$num_d" e="$num_e" f="$num_f" g="$num_g" h="$num_h" i="$num_i" j="$num_j" setvar="total">
<mt:var name="total">

結果
55

以上です。

以下のサイトはとても参考になりました。


この記事が気に入ったらサポートをしてみませんか?