式中の各演算子について、必要なオペランドが決定されます。例えば、乗算演算子には数値のオペランドが必要であり、CONTAINS 演算子には文字列のオペランドが必要です。関数の場合は、関数の各引数に必要な型が決定されます。例えば、Min 関数には引数として 2 つの数値が必要であり、Len 関数には 1 つの文字列が必要です。
ColdFusion では、式の演算要件(関数の引数の要件など)に合わせて、データ型が自動的に変換されます。したがって通常は、データ型の互換性や変換に注意を払う必要はありませんが、ColdFusion でどのようにデータ値が評価され、データ型が変換されるかを理解しておくと、エラーの防止やコードの効率化に役立ちます。
オペレーション志向の評価方法
従来のプログラミング言語では、様々な型のオブジェクトを式で組み合わせることは厳格に制限されています。例えば、C++ や Basic などの言語の場合、式("8" * 10)はエラーになります。乗算演算子のオペランドとして 2 つの数値が必要であるにもかかわらず、"8" という文字列が指定されているからです。このような言語でプログラムを作成するときは、データ型を変換してエラーを防ぐ必要があります。例えば、前の式は(ToNumber("8") * 10)と記述する必要があります。
しかし、ColdFusion では、式("8" * 10)は数値 80 と評価され、エラーは発生しません。ColdFusion では、乗算演算子を処理するときに、オペランドが自動的に数値に変換されます。"8" は数値 8 に正常に変換できるので、式は 80 と評価されます。
ColdFusion では、式および関数は次の順序で処理されます。
-
-
すべてのオペランドまたは関数の引数が評価されます。
-
オペランドや引数の型が必要な型と異なる場合は、それらがすべて変換されます。変換に失敗した場合はエラーが生成されます。
型の変換
ColdFusion の式評価メカニズムは強力ですが、すべてのデータを自動的に変換できるとは限りません。例えば、式 "eight" * 10 では、文字列 "eight" を数値 8 に変換できないのでエラーが発生します。したがって、データ型の変換ルールを理解する必要があります。
次の表に、実行される変換を示します。最初の列は変換元の値を示します。その他の列は、各データ型に変換された結果を示します。
値 |
ブール値 |
数値 |
日付時刻値 |
文字列 |
---|---|---|---|---|
"Yes" |
True |
1 |
エラー |
"Yes" |
"No" |
False |
0 |
エラー |
"No" |
True |
True |
1 |
エラー |
"Yes" |
False |
False |
0 |
エラー |
"No" |
数値 |
数値が 0 でない場合は True、0 の場合は False。 |
数値 |
この章の「日付時刻値」を参照してください。 |
数値の文字列表現("8" など) |
文字列 |
"Yes" の場合は True。"No" の場合は False。0 に変換できる場合は、False。0 以外の数値に変換できる場合は、True。 |
"1,000" や "12.36E-12" など、数値を表す場合は、対応する数値に変換されます。日付時刻値を表す場合(次の列を参照)は、対応する日付時刻オブジェクトの数値に変換されます。 |
ODBC の日付、時刻、またはタイムスタンプ |
文字列 |
日付 |
エラー |
日付時刻オブジェクトの数値 |
日付 |
ODBC タイムスタンプ |
ColdFusion では、配列、クエリ、COM オブジェクトなどの複合型は他の型に変換できません。ただし、複合型の単純データ要素を他の単純データ型に変換することはできます。
型変換に関する注意事項
次のセクションでは、型変換に関する詳細なルールおよび注意事項について説明します。
cfoutput タグ
cfoutput タグは、常にデータを文字列として表示します。したがって、cfoutput タグで変数が表示される前に、文字列以外のすべてのデータに対して型変換ルールが適用されます。例えば、cfoutput タグは日付時刻値を ODBC タイムスタンプとして表示します。
ブール値への変換では大文字と小文字が区別されない
ColdFusion の式評価では大文字と小文字は区別されないので、Yes、YES、yes は同じと見なされます。また、False、FALSE、false や、No、NO、no や、True、TRUE、true も同じと見なされます。
バイナリデータの変換
日付時刻データの変換
日付時刻値が確実に実数として表現されるようにするには、変数に 0 を加算します。その例を次に示します。
Use cfoutput to display the result of the now function:<br> <cfoutput>#mynow#</cfoutput><br> Now add 0 to the result and display it again:<br> <cfset mynow = mynow + 0> <cfoutput>#mynow#</cfoutput>
2003年6月6日、午後 1:06 である場合は、次のように出力されます。
{ts '2003-06-03 13:06:44'} Now add 0 to the result and display it again: 37775.5463426
数値の変換
整数と実数の両方が含まれている式を評価すると、結果は実数になります。実数を整数に変換するには、ColdFusion 関数を使用します。Int、Round、Fix、および Ceiling 関数を使用すると実数が整数に変換されますが、数値の小数部の処理はそれぞれ異なります。
名前に _integer または _range という接尾辞が付いている非表示フォームフィールドを使用してフォーム入力フィールドを検証する場合は、フィールドに入力された実数が整数に丸められ、その整数がアクションページに渡されます。
名前に _integer、_float、または _range という接尾辞が付いている非表示フォームフィールドを使用してフォーム入力フィールドを検証する場合は、入力されたデータにドル記号を含むドル金額やカンマ付き数値が含まれていても入力は有効と見なされ、値からドル記号やカンマが削除されて、その整数または実数がアクションページに渡されます。
ColdFusion には、任意精度の 10 進数(BigDecimal 数)を表す固有のデータ型は用意されていません。ColdFusion では、そのような数値はまず文字列として保存されます。その値を式で使用すると数値型に変換され、多くの場合精度が落ちます。精度を維持する PrecisionEvaluate メソッドを使用すれば、BigDecimal 精度演算を使用して文字列式が評価され、長い数値の文字列として結果が返されます。詳細については、『CFML リファレンス』の PrecisionEvaluate を参照してください。
評価および型変換の問題
以下の節では、型の評価および変換時に発生する可能性がある問題について説明します。
True または False と変数との比較
次に示す 2 つの cfif タグの例は、どちらも同じ結果が生成されるように見えるかもしれません。
<cfoutput>myVariable equals #myVariable# and is True </cfoutput> </cfif> <cfif myVariable IS True> <cfoutput>myVariable equals #myVariable# and is True </cfoutput> </cfif>
しかし実際は、常に同じになるとは限りません。myVariable に 12 などの数値が代入されている場合は、最初の例の結果のみが生成されます。2 番目の例の場合、IS 演算子は特定のデータ型を必要とせず、2 つの値の一致をテストするだけなので、myVariable の値がブール値に変換されることはありません。したがって、値 12 と定数 True が比較されることになります。この 2 つは等しくないので、何も出力されません。ただし、myVariable が 1、"Yes"、または True の場合は、ブール値 True とそれらが同じであると見なされるので、どちらの例でも同じ結果が出力されます。
次に示すコードでは、変数の値 12 とブール値 False は等しくないので、出力ステートメントが実行されます。
<cfoutput>myVariable equals #myVariable# and IS NOT False </cfoutput> </cfif>
したがって、変数が True か False かをテストする場合は、IS 比較演算子を使用せず、<cfif }}testvariable{{> でテストするようにしてください。この問題は、型があいまいな式の評価という問題の一例です。次のセクションで、この一般的な問題について説明します。
型があいまいな式および文字列
文字列を必要としない式(IS や GT などのすべての比較演算子も含む)が ColdFusion で評価されるときには、各文字列値を数値または日付時刻オブジェクトに変換できるかどうかが確認されます。変換できる場合は、対応する数値または日付時刻値(これは数値として保存されます)に変換されます。その後で、その数値が式で使用されます。
1a や 2P のような短い文字列では、予期しない結果が生成されることがあります。ColdFusion は、1 文字の "a" を AM、1 文字の "P" を PM と解釈します。したがって、文字列が意図せず日付時刻値として解釈されることがあります。
同様に、文字列を数値として解釈できる場合は、予期しない結果が生成されることがあります。
例えば、ColdFusion では次のように式が解釈されます。
式 |
解釈 |
---|---|
<cfif "1a" EQ "01:00"> |
1:00am が 1:00am である場合 |
<cfif "1P" GT "2A"> |
1:00pm が 2:00am より遅い場合 |
<cfset age="4a"><cfset age=age + 7> |
変数 age が 4:00 am と見なされて日付時刻値 0.16666666667 に変換され、7 が加算されて 7.16666666667 になります。 |
<cfif "0.0" is "0"> |
0 が 0 である場合 |
文字列比較時のこのようなあいまいさを防ぐには、比較演算子ではなく、ColdFusion の文字列比較関数 Compare および CompareNoCase を使用します。
また、日付時刻値として解釈できる文字列であるかどうかを IsDate 関数で調べたり、比較する前に文字列に文字を追加して間違って解釈されないようにすることもできます。
ODBC がサポートされていない場合の日付時刻関数およびクエリ
CFML には、Now、CreateDate、CreateTime および CreateDateTime など、日付時刻オブジェクトを返す関数が多く用意されています。ColdFusion では、日付時刻オブジェクトが文字列に変換されるときには、ODBC(Open Database Connectivity)タイムスタンプ値が作成されます。したがって、ODBC のエスケープシーケンスをサポートしていないデータベースドライバーで日付を使用したり、クエリオブクエリで SQL を使用したりすると、予期しない結果が生成されることがあります。
データベースドライバーで ODBC 形式の日付がサポートされていない場合は、SQL を使用してデータベースにデータを挿入するときや、WHERE 節でデータベースからデータを選択するときに DateFormat 関数を使用して、そのドライバーで有効な形式に日付時刻値を変換してください。これはクエリオブクエリにも当てはまります。
たとえば次の SQL ステートメントでは、クエリーオブクエリーで DateFormat 関数を使用して、将来の MyDate 値を持つ行を選択しています。
SELECT * FROM DateQuery WHERE MyDate >= '#DateFormat(Now())#' </cfquery>
次のクエリオブクエリは失敗し、「エラー :
有効な日付ではありません」のようなエラーメッセージが表示されます。これは、ColdFusion の Now 関数が
ODBC タイムスタンプを返すからです。
SELECT * FROM DateQuery WHERE MyDate >= '#now()#' </cfquery>
オーバーロードされた Java メソッドでの JavaCast の使用
Java では、メソッドをオーバーロードすることで、パラメーターのデータ型のみが異なる同じ名前のメソッドを 1 つのクラス内に用意することができます。実行時には、呼び出しで渡されたパラメーターの型に基づいて、Java 仮想マシンが適切なメソッドを選択します。ColdFusion では型が明示されていないので、仮想マシンでどのメソッドが選択されるかは予測できません。
ColdFusion の JavaCast 関数を使用して変数の Java 型を指定すれば、正しいメソッドが選択されるようになります。その例を次に示します。
<cfset emp.SetJobGrade(JavaCast("int", JobGrade))>
JavaCast 関数は、Java データ型を示す文字列と、その型を設定する変数の 2 つのパラメーターを取ります。指定できる Java データ型は、Boolean、int、long、float、double、および String です。
JavaCast 関数について詳しくは、『CFML リファレンス』を参照してください。
引用符の使用
ColdFusion で文字列データが正しく解釈されるようにするには、文字列を単一引用符(')または二重引用符(")で囲みます。例えば "10/2/2001" は、日付時刻オブジェクトに変換可能な文字列と評価されます。しかし、10/2/2001 は数式 5/2001 と解釈されるので、0.00249875062469 と評価されます。
式評価での型変換の例
ColdFusion の式評価の例を次に示します。
例 1
2 * True + "YES" - ('y' & "es")
文字列としての結果値:"2"説明:(2*True) は 2、("YES"- "yes") は 0 なので、2 + 0 は 2 になります。
例 2
"Five is " & 5 |
文字列としての結果値:"Five is 5"説明:5 は文字列 "5" に変換されます。
例 3
DateFormat("October 30, 2001" + 1) |
文字列としての結果値:"31-Oct-01"説明:加算演算子によって、文字列 "October 30, 2001" が日付時刻オブジェクトに変換され、さらに数値に変換されます。その数値に 1 が加算されます。DateFormat 関数の引数は日付時刻オブジェクトである必要があるので、加算された結果が日付時刻オブジェクトに変換されます。日付時刻オブジェクトに 1 が加算されたことで、変換結果は 1 日後の October 31, 2001 になります。