ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

ColdFusionで文字列を分解するのがめんどくさすぎる…。

ColdFusionにも専用の関数が用意されていてちょっとしたロジックならこれでやりくりができます(それなりにコツが要るけど)。でもこの関数がちょっとした曲者。


ColdFusionは中身はPure Javaだそうですが、昔からの慣習だかなんだか知らないけど感数名がJavaのそれと全く関係無いので、必要な関数が探しにくいんです。例えば今回苦労した以下の実装もそのひとつ。



会員登録ページなんかによくある、電話番号の入力欄です。DBには「03-XXXX-XXXX」というようにハイフンが混ざった状態で登録されており、入力欄に再表示させるにはハイフンを区切りにして分解する必要があります。


JavaならindexOf() と substring()で瞬殺できるんですが、ColdFusionではそうは行きません。これらのメソッドと同等の機能を持つ関数が無く、名前も無茶苦茶。

一例を上げると、文字列の先頭から◯文字を取り出すメソッドが「Left()」、逆に末尾から取り出すのが「Right()」、特定の文字が文字列の先頭から数えて何文字目にあるかを調べるメソッドが「findOneOf()」。…まぁある意味分かりやすいと言えなくは無いですが…。あとどうでもいいけど、インデックスも0からじゃなくて1から始まるんです。もう面倒くさくってしょうがない。


ちなみに今回は以下の様な実装で解決しました。

<tr height="60">
	<td align="left" valign="middle" nowrap>電話番号</td>
	<td align="left" valign="middle" nowrap>
		<CFSET del1="#FindOneOf('-', TEL_NO, 1)#">
		<CFSET del2="#FindOneOf('-', TEL_NO, del1 + 1)#">
		<input type="text" name="telNo1" size="4" value="#Mid(TEL_NO, 1, del1)#"> - <input type="text" name="telNo2" size="4" value="#Mid(TEL_NO, del1 + 1, del2 - del1 -1)#"> - <input type="text" name="telNo2" size="4" value="#Mid(TEL_NO, del2 + 1, Len(TEL_NO) - del2)#">
	</td>
</tr>


findOneOf()」でハイフンの位置を割り出して「Mid()」で文字列を取り出しています。「Mid()」は前述のLeft()とRight()の中間みたいな位置づけの関数で、第一引数に対象の文字列、第二引数に開始インデックス、第三引数に取り出す文字数を指定します。


関数だけで出来なくは無いんですが、それだとソースコードがばっちくなってしまうので、いちいちでハイフンのインデックスをキープするようにしています。


なにもColdFusionだけで解決しなくても、DB側でSQLで分解する手法もあると思いますが、今回使用しているSQL Serverでは手頃な関数が見つかりませんでした。もしSQLの段階で分解出来ちゃえば、UIを汚さずに済むので、その方が良いと思ってはいます。…オレがSQLが大の苦手で無ければ回避策も見つかったかもしれないのに、グギギ…。