- - PR -
日付を2007/3/30とするには
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-30 18:29
いつもありがとうございます。
本日、もう1点だけお聞きしたいことがあります。 日付(数字8桁 例えば20070330)を渡し、2007/3/30を 返すFunctionプロシージャを作りたいのですが Private Function fYYYYMMDD2(ByVal pDATE As Long) As String Dim strDATE If pDATE = "0" Then fYYYYMMDD2 = "" Exit Function End If strDATE = CStr(pDATE) fYYYYMMDD2 = Left(strDATE, 4) & "年" & Format(CInt(Mid(strDATE, 5, 2)), "#0") & "月" & Format(CInt(Mid(strDATE, 7, 2)), "#0") & "日" End Function と作ってみましたが CIntを使わず、TryParseを使いたいのですが(変換例外エラーにならないため) TryParseを使うとなると、全て変換後の値を受け取る変数を 持たせる必要があるみたいでプロシジャーが長くなってしまいます。 TryParseを使って何とかシンプルなプロシジャーの 手本を見せていただけませんか? 宜しくお願いします。 | ||||||||||||
|
投稿日時: 2007-03-30 19:17
TryParse に頼らずに変換をしたほうがよいような気もしますが、
「TryParse を使って」ということですので使ってみました。 ToString のフォーマットを使えば 数値→文字列、日付→文字列の変換はできると思います。 Private Function fYYYYMMDD2(ByVal pDATE As Long) As String '数値を文字列化 dim dateString as string = pDate.ToString("0000/00/00") dim dateValue as DateTime if ( DateTime.TryParse( dateString, dateValue ) then '日付変換に成功 '文字列化して返す return dateValue.ToString("yyyy/M/d") else '変換失敗 '何を返すかが問題 end if end function ※動かしたわけではありませんのでミスがあるかもしれません。 | ||||||||||||
|
投稿日時: 2007-03-30 19:28
個人的にはハンドル名をつけない「未記入」さんにはあまり返信したくない
というポリシーがありますが…
シンプルなものをちょっと作ってみましたが、ParseInt を使う場面が全くな くなってしまいました。引数が Long なので、意味がないんじゃないかと。
CInt を使わず、TryParse を使うという方針は大変良いと思いますが、そ の理由が「変換例外エラーにならないため」であったり、TryParse を使う とプロシジャーが長くなる…と言った考え方は捨てられた方が賢明です。 多少コードが長くなろうと、読みやすい、わかりやすいコードを書く方が数 倍、いや数万倍は重要です。 TryParse 云々の前に、まずアルゴリズムから勉強された方が良いように 思いますが、いかがでしょうか。 # パンツを履くと着ぶくれするから素肌の上にズボンを履きます!みたいな # メタファを思いついたけど下品なので止めた ----- ---------- ---------- ---------- ---------- ----- っと、書きかけていたら masa さんがすでにコードを… でもこれって、地域と言語のオプションが変更されていたら動かない可能 性もありますね。 (それを承知で TryParse を使うために書いたのかな?) _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||
|
投稿日時: 2007-03-30 19:37
| ||||||||||||
|
投稿日時: 2007-03-30 19:54
すいません、ハンドル名を付けるのが解らないままに
投稿していました。 本当にすいません。 | ||||||||||||
|
投稿日時: 2007-03-30 21:24
よくない関数の代表例だなw
せめてyear,month,dayに分けた引数を持つべきだ。 fYYYYMMDD2に萌えたw | ||||||||||||
|
投稿日時: 2007-03-31 11:23
みなさんありがとうございます。
元々データをホストからサーバーに落とし使っていますが ホストの日付データが数字の8桁で持っているためそのまま使用しています。 わたしとしましてはmasaさんのような答えがほしかったのですが 数字8桁を2007年3月31日や2007/3/31とするのはこれでokです。 そして数字6桁を07年3月31日や07/3/31とするのもこれでokです。 年月日別々の場合何かよい知恵はありませんか? 今までのコードです。 ActiveReportのフィールドにfldNOKYY,MM,DDに 07 3 31 と年月日を分解してセットします。 Dim lngNOK AS Long Dim strDATE AS String lngNOK = 20070331 strDATE = CStr(lngNOK) fldNOKYY.Text = Format(CLng(Mid(strDATE, 3, 2)), "00") fldNOKMM.Text = Format(CLng(Mid(strDATE, 5, 2)), "##") fldNOKDD.Text = Format(CLng(Right(strDATE, 2)), "##") こういう場合もTryParse に変えたいのですが 年月日別々に変換していくしかないでしょうか? | ||||||||||||
|
投稿日時: 2007-03-31 11:52
すいません、もう1点だけお願いします。
LongをMid関数を使って分解する場合、使う前にStringに変換してから使った方が よいのでしょうか? またCstrよりToStringを使うべきなのでしょうか? |