- PR -

日付を2007/3/30とするには

投稿者投稿内容
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 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を使って何とかシンプルなプロシジャーの
手本を見せていただけませんか?

宜しくお願いします。



masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 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

※動かしたわけではありませんのでミスがあるかもしれません。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-03-30 19:28
個人的にはハンドル名をつけない「未記入」さんにはあまり返信したくない
というポリシーがありますが…

引用:

未記入さんの書き込み (2007-03-30 18:29) より:

日付(数字8桁 例えば20070330)を渡し、2007/3/30を
返すFunctionプロシージャを作りたいのですが
(snip)
TryParseを使って何とかシンプルなプロシジャーの
手本を見せていただけませんか?


シンプルなものをちょっと作ってみましたが、ParseInt を使う場面が全くな
くなってしまいました。引数が Long なので、意味がないんじゃないかと。

コード:

Private Function fYYYYMMDD2(ByVal pDate As Long) As String
    ' 年を計算
    Dim year As Integer = pDate \\ 10000

    ' 月を計算
    Dim month As Integer = (pDate \\ 100) Mod 100

    ' 日を計算
    Dim day As Integer = pDate Mod 100

    ' DateTime型に格納してフォーマットしたものを返す
    Dim today As DateTime = New DateTime(year, month, day)

    Return today.ToString("yyyy年M月d日")
End Function



引用:

CIntを使わず、TryParseを使いたいのですが(変換例外エラーにならないため)
TryParseを使うとなると、全て変換後の値を受け取る変数を
持たせる必要があるみたいでプロシジャーが長くなってしまいます。


CInt を使わず、TryParse を使うという方針は大変良いと思いますが、そ
の理由が「変換例外エラーにならないため」であったり、TryParse を使う
とプロシジャーが長くなる…と言った考え方は捨てられた方が賢明です。
多少コードが長くなろうと、読みやすい、わかりやすいコードを書く方が数
倍、いや数万倍は重要です。
TryParse 云々の前に、まずアルゴリズムから勉強された方が良いように
思いますが、いかがでしょうか。
# パンツを履くと着ぶくれするから素肌の上にズボンを履きます!みたいな
# メタファを思いついたけど下品なので止めた

----- ---------- ---------- ---------- ---------- -----

っと、書きかけていたら masa さんがすでにコードを…
でもこれって、地域と言語のオプションが変更されていたら動かない可能
性もありますね。
(それを承知で TryParse を使うために書いたのかな?)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2007-03-30 19:37
コード:

    Public Function GetDateString(ByVal input As Long) As String

        Dim dateTime As Date = Date.MinValue

        If Not Date.TryParse(input.ToString("####/##/##"), dateTime) Then Throw New ArgumentException

        Return dateTime.ToString("yyyy年M月d日")

    End Function

LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-03-30 19:54
 すいません、ハンドル名を付けるのが解らないままに
投稿していました。

本当にすいません。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-03-30 21:24
よくない関数の代表例だなw
せめてyear,month,dayに分けた引数を持つべきだ。

fYYYYMMDD2に萌えたw
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 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 に変えたいのですが
年月日別々に変換していくしかないでしょうか?

LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-03-31 11:52
すいません、もう1点だけお願いします。
LongをMid関数を使って分解する場合、使う前にStringに変換してから使った方が
よいのでしょうか?
またCstrよりToStringを使うべきなのでしょうか?


スキルアップ/キャリアアップ(JOB@IT)