ColdFusionで <cfif>による条件分岐を行う際には、一点注意する事項があります。それはAとBの文字列が同じかどうかを判定する処理において一般的に使用されている決定演算子(EQ, IS 等イコールと同義)で、見た目で異なっているAとBが同じ値として判定されてしまうものです。
これはColdFusionの仕様としてマニュアルにも記載されていますが、決定演算子や比較演算子(GT、LT 等 < や >)を使った条件分岐処理は、まず、対象となるデータを数値や日付時刻オブジェクトに変換できるかどうかが判定されます。変換できる場合は、データの数値または日付比較が行われ、変換できない場合は文字列比較が行われます。つまり「1」と「0001」や 「1」と「1.000」、あるいは「0」と「0e1(指数として処理)」などは数値として扱われて同じという判定になります。<cfif>による文字列比較において予期しない結果となる原因はこの変換処理によるものです。
(参考:ColdFusion 10 アプリケーションの開発 - 演算子のタイプ)
http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec09d55-7ffc.html
対応としては、文字列の比較を行う際は、上記の「決定演算子のルール」に記載されているリンク先の「評価および型変換の問題」に記載されているように決定(比較)演算子を使った条件分岐ではなくCompare()関数やCompareNoCase()関数を使用する方法で処理を行って下さい。
#Compare(文字列1, 文字列2)#
文字列1と文字列2が一致している場合に 0 を戻します。
<cfset a=0001> <cfset b="1.000"> <cfif compare(a,b) EQ 0> 同じ <cfelse> 違う </cfif> <cfif a EQ b> 同じ <cfelse> 違う </cfif>
違う 同じ
ColdFusion のマニュアルには、上記の例以外にもさまざまなパターンが書かれています。「決定演算子のルール」のURLは下記となります。こちらもご参照ください。
http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7f46.html
記事公開日:2013年01月28日
最終更新日:2013年01月28日
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.
Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.