前回、文字列のまま日付を追加してくれるDateAddtoStringより、文字列のまま、日付を追加することができるファンクションを紹介しました。
で、作りながら、少し気になっていたことがあって、第一引数の文字列から日付を作成する際に、入力チェックをかけたいなーと思いました。
しかし、このファンクション内で記述しまうと、ファンクション自体が長くなってしまい、かつ、日付を作成するという意味では、別機能だと思ったので、あえて日付を作成するファンクションを作成してみました。
具体的には、下のコードに、入力チェックを追加した日付作成ファンクションを作成しました。
<CFSET cf_Ret_Date = CreateDate(cf_YYYY,cf_MM,cf_DD)> |
そして、できあがったファンクションは、このような形になりました。
<CFFUNCTION name="toDate"> <CFARGUMENT name="aStr" type="String" required="yes"> <CFSCRIPT> var cf_YYYY = ""; var cf_MM = ""; var cf_DD = ""; </CFSCRIPT> <!--- Check is Numeric ? ---> <CFIF IsNumeric(aStr) eq False> <CFRETURN false> </CFIF> <!--- Check is grater than 0 ---> <CFIF aStr lte 0> <CFRETURN false> </CFIF> <!--- Check existed dot ? ---> <CFIF Find(".",aStr) neq 0> <CFRETURN false> </CFIF> <!--- Check is 8 length ---> <CFIF Len(aStr) neq 8> <CFRETURN false> </CFIF> <CFSET cf_YYYY = Left(aStr,4)> <CFSET cf_MM = Mid(aStr,5,2)> <CFSET cf_DD = Right(aStr,2)> <!--- Check is toDate ? ---> <CFIF IsDate(cf_YYYY&"."&cf_MM&"."&cf_DD) eq False> <CFRETURN false> </CFIF> <CFRETURN CreateDate(cf_YYYY,cf_MM,cf_DD)> </CFFUNCTION> |
まず、引数が文字列なので、入力された引数が数字に変換できるかどうかのチェック。
<!--- Check is Numeric ? ---> <CFIF IsNumeric(aStr) eq False> <CFRETURN false> </CFIF> |
次に、引数は、0よりも大きいか?
<!--- Check is grater than 0 ---> <CFIF aStr lte 0> <CFRETURN false> </CFIF> |
さらに小数点の入った文字列型の数字を入力があるかもしれないので、「.」チェック。
<!--- Check existed dot ? ---> <CFIF Find(".",aStr) neq 0> <CFRETURN false> </CFIF> |
そして、ジャスト8桁で入力にしてほしいので、8桁以外はエラーになるような処理も追加しました。
<!--- Check is 8 length ---> <CFIF Len(aStr) neq 8> <CFRETURN false> </CFIF> |
ラストに、年、月、日、のそれぞれの間に「.」を入れて、IsDateで引数を評価することで、日付型に変更できるかどうかジャッジをしています。
<CFSET cf_YYYY = Left(aStr,4)> <CFSET cf_MM = Mid(aStr,5,2)> <CFSET cf_DD = Right(aStr,2)> <!--- Check is toDate ? ---> <CFIF IsDate(cf_YYYY&"."&cf_MM&"."&cf_DD) eq False> <CFRETURN false> </CFIF> |
返り値として、CreateDateされた日付型の引数を返します。
<CFRETURN CreateDate(cf_YYYY,cf_MM,cf_DD)> |
そして、今回、苦戦したのは、IsDateの評価!!
単純に下の式では、Falseを返してしまうところ。。
<CFSET hoge = IsDate("20080212")> <--- 下の式では、falseを返す ---> <CFOUTPUT>#hoge#</CFOUTPUT> |
どーしてなんだろうーと思い、7のリファレンスを見てもわからなかったので、「.」を間に挟むことで、問題を解消しました。
<CFSET hoge = IsDate("2008.02.12")> <--- 下の式では、trueを返す ---> <CFOUTPUT>#hoge#</CFOUTPUT> |
これでパーツが完成したので、DateAddtoStringファンクションに組み込んでみたいと思います。
今回の記事では長くなってしまったので、次回の記事にて。。。^-^v
0 コメント:
コメントを投稿