C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 日付フォーマットチェックに関して


(過去ログ 50 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■27616 / inTopicNo.1)  日付フォーマットチェックに関して
  
□投稿者/ カイオウ (1回)-(2008/11/11(Tue) 13:58:18)

分類:[C#] 

お世話になります。

Microsoft Visual Studio 2008 評価版 C# Windowsアプリケーションにて開発を行っているカイオウと申します。

textboxにて入力された値が、yyyy年MM月dd日であるかどうかのチェック関数を作成しているのですが、いちいちindex何番目〜何番目が数値であるか?実在する年月日であるか?などをチェックしていかなければならないのでしょうか?

何か簡単にチェックが行えるメソッドなどあったような気がしたのですが、
随分と久しぶりなもので…

どなたかご教授頂けませんでしょうか?

お忙しいところ初歩的な質問で恐縮ではございますが、
ご教授の方をお願い致します。
引用返信 編集キー/
■27617 / inTopicNo.2)  Re[1]: 日付フォーマットチェックに関して
□投稿者/ ouh (1回)-(2008/11/11(Tue) 14:13:28)
DateTime.Parse()
とか
DateTime.TryParse()
でしょうか。
引用返信 編集キー/
■27618 / inTopicNo.3)  Re[2]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (2回)-(2008/11/11(Tue) 14:23:58)
No27617 (ouh さん) に返信
> DateTime.Parse()
> とか
> DateTime.TryParse()
> でしょうか。

ouh 様
早速のご返信ありがとうございます。

try catch句の中で型変換を行うチェックを実装したところ、
たとえば、テキストに"2008年11月11"と"日"を入れない状態でも
変換されてしまいます…。

もう少し良い方法はないものでしょうか??
引用返信 編集キー/
■27619 / inTopicNo.4)  Re[3]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (3回)-(2008/11/11(Tue) 14:24:20)
No27618 (カイオウ さん) に返信
> ■No27617 (ouh さん) に返信
>>DateTime.Parse()
>>とか
>>DateTime.TryParse()
>>でしょうか。
>
> ouh 様
> 早速のご返信ありがとうございます。
>
> try catch句の中で型変換を行うチェックを実装したところ、
> たとえば、テキストに"2008年11月11"と"日"を入れない状態でも
> 変換されてしまいます…。
>
> もう少し良い方法はないものでしょうか??
引用返信 編集キー/
■27620 / inTopicNo.5)  Re[4]: 日付フォーマットチェックに関して
□投稿者/ ouh (2回)-(2008/11/11(Tue) 14:29:17)
では、カイオウさんにとって正しい書式かどうかというところは
普通に文字列処理とか正規表現を使うとかでチェックして、
DateTime.Parse() はカイオウさんのおっしゃる「実在する年月日
かどうか」のチェックに使うという感じではどうでしょうか?
なんだか全然「簡単にチェック」ではなくなってきちゃいました
ね。すみません。
引用返信 編集キー/
■27621 / inTopicNo.6)  Re[5]: 日付フォーマットチェックに関して
□投稿者/ みきぬ (203回)-(2008/11/11(Tue) 14:34:34)
DateTime.ParseExact()
DateTime.TryParseExact()
がありまっせ。
引用返信 編集キー/
■27622 / inTopicNo.7)  Re[5]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (5回)-(2008/11/11(Tue) 14:35:17)
No27620 (ouh さん) に返信
> では、カイオウさんにとって正しい書式かどうかというところは
> 普通に文字列処理とか正規表現を使うとかでチェックして、
> DateTime.Parse() はカイオウさんのおっしゃる「実在する年月日
> かどうか」のチェックに使うという感じではどうでしょうか?
> なんだか全然「簡単にチェック」ではなくなってきちゃいました
> ね。すみません。

ouh 様
またまたご返答ありがとうございます。
何かありそうで見つからないんですよね…。

文字列フォーマットに関してと、実在日チェックを分けないと現実、無理そうでしょうか??

引用返信 編集キー/
■27623 / inTopicNo.8)  Re[6]: 日付フォーマットチェックに関して
□投稿者/ ouh (3回)-(2008/11/11(Tue) 14:38:35)
カイオウさんすみません。
みきぬさんの案が一番いいと思います。
でも
>文字列フォーマットに関してと、実在日チェックを分けないと現実、無理そうでしょうか??
これもほんの数行でできますよ。

とはいえ、やっぱりみきぬさんの案が一番です。
引用返信 編集キー/
■27624 / inTopicNo.9)  Re[7]: 日付フォーマットチェックに関して
□投稿者/ ouh (4回)-(2008/11/11(Tue) 14:41:22)
一応、正規表現使うとこんな感じでしょうか。

string s = "2008年12月31日";
System.Text.RegularExpressions.Regex regex =
  new System.Text.RegularExpressions.Regex("^[0-9]{4}年[0-9]{2}月[0-9]{2}日$");
if (!regex.IsMatch(s)) {
  MessageBox.Show("書式がダメ");
  return;
}
DateTime dt = new DateTime();
if (!DateTime.TryParse(s, out dt)) {
  MessageBox.Show("そんな年月日ないです");
  return;
}

引用返信 編集キー/
■27626 / inTopicNo.10)  Re[7]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (8回)-(2008/11/11(Tue) 14:42:25)
No27623 (ouh さん) に返信
> カイオウさんすみません。
> みきぬさんの案が一番いいと思います。
> でも
> >文字列フォーマットに関してと、実在日チェックを分けないと現実、無理そうでしょうか??
> これもほんの数行でできますよ。
>
> とはいえ、やっぱりみきぬさんの案が一番です。


ouh様、みきぬ様ありがとうございました。
以下のように解決できました!!
ありがとうございましたm(>_<)m

private bool IsDate(string date)
{
try
{
DateTime dt = DateTime.ParseExact(date, "yyyy年MM月dd日", null);
return true;
}
catch (Exception)
{
return false;
}
}

解決済み
引用返信 編集キー/
■27627 / inTopicNo.11)  Re[8]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (11回)-(2008/11/11(Tue) 14:45:46)
No27624 (ouh さん) に返信
> 一応、正規表現使うとこんな感じでしょうか。
>
> string s = "2008年12月31日";
> System.Text.RegularExpressions.Regex regex =
>   new System.Text.RegularExpressions.Regex("^[0-9]{4}年[0-9]{2}月[0-9]{2}日$");
> if (!regex.IsMatch(s)) {
>   MessageBox.Show("書式がダメ");
>   return;
> }
> DateTime dt = new DateTime();
> if (!DateTime.TryParse(s, out dt)) {
>   MessageBox.Show("そんな年月日ないです");
>   return;
> }

ouh様
またまたご返答ありがとうございました。
ouh様の方を採用させて頂きます。

どちらでエラーがでたかも取得したいので…。

本当にありがとうございました。

最強最良の掲示板でした。
また投稿させて頂きたいと思います。


引用返信 編集キー/
■27628 / inTopicNo.12)  Re[9]: 日付フォーマットチェックに関して
□投稿者/ カイオウ (12回)-(2008/11/11(Tue) 14:46:23)
No27627 (カイオウ さん) に返信
> ■No27624 (ouh さん) に返信
>>一応、正規表現使うとこんな感じでしょうか。
>>
>>string s = "2008年12月31日";
>>System.Text.RegularExpressions.Regex regex =
>>  new System.Text.RegularExpressions.Regex("^[0-9]{4}年[0-9]{2}月[0-9]{2}日$");
>>if (!regex.IsMatch(s)) {
>>  MessageBox.Show("書式がダメ");
>>  return;
>>}
>>DateTime dt = new DateTime();
>>if (!DateTime.TryParse(s, out dt)) {
>>  MessageBox.Show("そんな年月日ないです");
>>  return;
>>}
>
> ouh様
> またまたご返答ありがとうございました。
> ouh様の方を採用させて頂きます。
>
> どちらでエラーがでたかも取得したいので…。
>
> 本当にありがとうございました。
>
> 最強最良の掲示板でした。
> また投稿させて頂きたいと思います。
>
>
解決済み
引用返信 編集キー/
■27629 / inTopicNo.13)  Re[8]: 日付フォーマットチェックに関して
□投稿者/ みきぬ (204回)-(2008/11/11(Tue) 14:52:11)
2008/11/11(Tue) 14:53:58 編集(投稿者)
TryParseExact() のほうがいいかも。
# ただしDateTimeStyles の指定がこれでいいかは自信なし

private bool IsDate(string date) 
{
    DateTime dt;
    return DateTime.TryParseExact(date, "yyyy年MM月dd日", null, System.Globalization.DateTimeStyles.None, dt);
}

あとこの書式だと、月と日は2桁必須になりますが、それでも大丈夫?
("2009年01月03日" じゃなくて)"2009年1月3日" も許容したいのであれば、 "yyyy年M月d日" かな。

引用返信 編集キー/
■27639 / inTopicNo.14)  Re[9]: 日付フォーマットチェックに関して
□投稿者/ 魔界の仮面弁士 (890回)-(2008/11/11(Tue) 16:21:43)
No27629 (みきぬ さん) に返信
> TryParseExact() のほうがいいかも。
同じく、TryParseExact に一票。

> return DateTime.TryParseExact(date, "yyyy年MM月dd日", null, System.Globalization.DateTimeStyles.None, dt);
「out」が抜けてます。この場合は、
 return DateTime.TryParseExact(date, "yyyy年MM月dd日", null, System.Globalization.DateTimeStyles.None, out dt);
かと。

それとこのパターンでは、結果がコントロールパネルの地域設定に依存するのでご注意を。たとえば、
 string date = "20年11月11日";
という文字列の場合、地域設定が「西暦」モードのままであれば、false として処理されますが、
地域設定で「和暦」モードの場合、true(2008年扱い)として処理される事になります。
引用返信 編集キー/
■27641 / inTopicNo.15)  Re[10]: 日付フォーマットチェックに関して
□投稿者/ みきぬ (206回)-(2008/11/11(Tue) 16:39:25)
No27639 (魔界の仮面弁士 さん) に返信
> それとこのパターンでは、結果がコントロールパネルの地域設定に依存するのでご注意を。たとえば、
>  string date = "20年11月11日";
> という文字列の場合、地域設定が「西暦」モードのままであれば、false として処理されますが、
> 地域設定で「和暦」モードの場合、true(2008年扱い)として処理される事になります。
>
あ、平成20年と解釈されるんですね。理解できました。
常に西暦として解釈したい場合は、カルチャ情報を en-US か InvariantCulture に指定すればいいのかな…?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -