Under the Bridge

a Picture of the Late Him

MT4.2:テンプレートタグのみで切り捨て、切り上げ、四捨五入の演算

2008年11月 4日 12:36 | Writer: yoshi | 記事本文 | コメント(3) | トラックバック(0)

昨日、思わぬ方から、当ブログ記事およびmtde.infoサイトへの記事への言及をいただいた。

ううむ...プラグインなのか? (今回はダイナミックパブリッシングなんだよ...)

で、早い話、「切り捨て、切り上げ、四捨五入の演算は、JavaScriptかプラグインでしかできないのか?」ということである。理由はダイナミックパブリッシング対応のページで演算を行いたいから、とある。そして、Junnamaさん自らのお手本コードが掲載されている。

...むむ...それは一秒も考えていなかった...なので、私も独自に、テンプレートタグのみで「切り上げ、切り捨て、四捨五入」コードを書いてみることにした。

MTSetVarTemplateを使用する

このようなときに、MTSetVarTemplateテンプレートタグを積極的に使用する例はあまり見ない。使いづらいんだろうか...?MTSetVarTemplateタグは、MTSetVarBlockと似たようなもんだが、決定的な違いがある。

MTSetVarBlock:その部分(MTSetVarBlock内部コード)が再構築されるときに実行される

MTSetVarTemplate:その部分(MTSetVarBlock内部コード)で、MTSetVarTemplateで定義された変数が参照されたときに実行される

この違いは大きい。

MTSetVarTemplateは、例えばエントリページに演算が百箇所ある場合でも、記述は1箇所で済んでしまう(なぜなら、参照されたときに実行され、実行回数に特に縛りが無いからだ)し、演算関数としてモジュール化してエントリページのテンプレート先頭にでもインクルード分を一行置けば、簡単に使える。これは、MTが変数を内部でパブリックで使用しているという特性を利用している諸刃の剣だが...。

コードの紹介

<MTIgnore>----------- 関数群 -----------</MTIgnore>

<MTIgnore>切り上げ</MTIgnore>
<MTSetVarTemplate name="MTCeil">
   <MTSetVar name="para" op="+" value="1">
   <MTGetVar name="para" sprintf="%d">
</MTSetVarTemplate>

<MTIgnore>切り捨て</MTIgnore>
<MTSetVarTemplate name="MTFloor">
   <MTGetVar name="para" sprintf="%d">
</MTSetVarTemplate>

<MTIgnore>四捨五入</MTIgnore>
<MTSetVarTemplate name="MTRound">
   <MTSetVar name="para" op="+" value="0.5">
   <MTGetVar name="para" sprintf="%d" numify=",">
</MTSetVarTemplate>


<MTIgnore>----------- 関数群 -----------</MTIgnore>


<MTSeTVar name="Var1" Value="12345678.90">
<MTSeTVar name="Var2" Value="56789012.34">

<MTIgnore>切り上げテスト</MTIgnore>
<MTSetVar name="para" value="$Var1">
<p>切り上げ1:<MTGetVar name="MTCeil"></p>
<MTSetVar name="para" value="$Var2">
<p>切り上げ2:<MTGetVar name="MTCeil"></p>

<MTIgnore>切り捨てテスト</MTIgnore>
<MTSetVar name="para" value="$Var1">
<p>切り捨て1:<MTGetVar name="MTFloor"></p>
<MTSetVar name="para" value="$Var2">
<p>切り捨て2:<MTGetVar name="MTFloor"></p>

<MTIgnore>四捨五入+3桁カンマ区切りテスト</MTIgnore>
<MTSetVar name="para" value="$Var1">
<p>四捨五入1:<MTGetVar name="MTRound"></p>
<MTSetVar name="para" value="$Var2">
<p>四捨五入2:<MTGetVar name="MTRound"></p>

「関数群」と書かれた場所に、切り上げ、切り捨て、四捨五入のコードが書いてある。

※四捨五入のコードのみ、千の位区切りでカンマで区切ってある。これはnumify=","モデファイアで簡単に実現可能である。

原理は、簡単だ...

※sprintf="%d"モデファイアが、切り捨ての値を返すもの(※perlでは、sprintf="%d"では10進数 -Deximalを返す、とある。切り捨てなのかどうかは確認したわけではない)とすると

切り上げ:変数に+1してsprintf="%d"で返せばいい

切り捨て:変数をそのままsprintf="%d"で返せばいい

四捨五入:変数に+0.5してsprintf="%d"で返せばいい

numify=","モデファイアを指定すれば、適切な箇所でカンマ区切りとなる。

使用するときは、paraという変数へ演算したい値を代入し、そのあとMTCeil(切り上げ)、MTFloor(切り捨て)、MTRound(四捨五入)いずれかをMTGetvarするだけでいい。paraという変数は、使い捨てのパブリック変数という感じで、演算を行うたびに何度も上書き使用している。他のテンプレートで使用している変数名とかぶらないように十分に注意せねばいけない。

おまけ

ソースの見通しを良くするには、上記サンプルコードの「関数群」で囲まれた部分をmdlMathなどという独立したモジュールとし、使用直前に(つまり演算がエントリページで行われる場合はエントリページの先頭付近)インクルードすると良い。

なお、MTSetvarTemplateの記述箇所が演算部分よりソース位置で下へ来ると、正常に動作しない。MTSetVarTemplate部分は、演算部分より先に書くこと。インクルードするときは演算部より前でインクルードする。

というか、そもそも、ダイナミックパブリッシングで動くかどうか不明。試す環境もない。

あと、最初に再構築されるテンプレートってどれか?環境によって違うのか?仮にmdlMathモジュールを作ったとすると、そこのみにインクルードでいい(と思う)んだけどな...。


追記:2008/11/04 PM23:00

演算結果がぴったりな値(7.00とか1500.00とか)を切り上げで扱うとき、切上げを行いたくない場合は、その旨、If文でほにゃららと書いてあげる必要がある。

トラックバック(0)

このブログ記事を参照しているブログ一覧: MT4.2:テンプレートタグのみで切り捨て、切り上げ、四捨五入の演算

このブログ記事に対するトラックバックURL:

コメント(3)

oscar (2008年11月 8日 01:55)

まんま、上のコードを試してみた。

切り上げ1:1
切り上げ2:1
切り捨て1:0
切り捨て2:0
四捨五入1:0
四捨五入2:0

という訳で、ダイナミックパブリッシングじゃダメっぽいです。
sprintfが使えないのかな?

oscar (2008年11月 8日 09:48)

その後いろいろ試してみた。
結果的にはsprintfは問題なく使えている。PHPのモディファイアファイルも存在したし。
実は動作しない部分は
<MTSetVar name="para" value="$Var1">
の部分みたいだ。
直接数字を渡すと、ダイナミックパブリッシングでも動作した。

yoshi (2008年11月 8日 13:53)

おかしいですね。
<MTSetVar name="para" value="$Var1">
は構文的に間違いではありませんし...スタティックではOKなのは確認しています。
まあ、直接数字を渡せばいいのでしょう。いろいろ実験してくださいまして、ありがとうございます。

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008 yoshi(apstar)