cfif で文字列を比較する際の注意事項

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日


x

Sample Modal Window

This is just a sample…

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.