- PR -

IsDate関数でエラーが出るのですが

投稿者投稿内容
納涼床
ベテラン
会議室デビュー日: 2006/06/28
投稿数: 53
お住まい・勤務地: 京都市下京区
投稿日時: 2007-05-01 11:08
「if IsDate(strA)=True then 〜 else 〜 end if」というif文を作成しているのですが、

strA="0.5m3mmジャック付5本"

のとき
「正の数値が必要です。パラメータ名: year」というエラーが出て異常終了しました。
(「datetime.tryparse(strA,result)」でも同様のエラーが出ます。)
strAのうち異常終了する原因の文字列が何かあるのでしょうか?
また、上記エラーを回避する方法がありましたら教えていただけませんでしょうか。

なお、開発環境は

・Visual studio 2005
・Net Framework ver 2.0
・Asp.net

です。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2007-05-01 11:46
本当ですね。「0.5m3」だけでも例外になるようです。

正しい方法かどうかは分かりませんが、例外を出さないようにするには、Try 〜 Catch する方法があります。
ただし、他の例外を握り潰さないように注意する必要はあると思いますが。

ちなみに、似たような話題「vb.netのIsDate関数のバグ?」もありました。
解決したのかどうか分かりませんが・・・

#追記
個人的には、「0.5m3mmジャック付5本」という文字列を日付チェックしないといけない仕様に疑問を感じますけど。
あと、IsDate メソッドより、System.DateTime 構造体の TryParse メソッドの使用をお薦めします。

[ メッセージ編集済み 編集者: ひろれい 編集日時 2007-05-01 11:54 ]
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-01 11:56
こちらでも再現確認できました。
C# の TryParse でも同じみたいですね。
おそらくバグじゃないかと思います。

コード:
string str = "0.1m3";
DateTime dt;

if (DateTime.TryParse(str, out dt))
{
    Console.WriteLine("True");
}
else
{
    Console.WriteLine("False");
}

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-05-01 12:05
引用:

納涼床さんの書き込み (2007-05-01 11:08) より:

strA="0.5m3mmジャック付5本"

のとき
「正の数値が必要です。パラメータ名: year」というエラーが出て異常終了しました。
(「datetime.tryparse(strA,result)」でも同様のエラーが出ます。)
strAのうち異常終了する原因の文字列が何かあるのでしょうか?


恐らく、ですが、0.5 の . 前を年の値として判定しようとして例外が発生しているのでしょう。

"2000.5m3mmジャック付5本"

とすると例外エラーにならず、想定通りの動作をしますね。
ひろれいさんの仰るように try 〜 catch で凌ぐしかないかもしれませんね。
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-01 12:43
コード:

    private void MosaMosaAA() {
        System.DateTime dtResult;
        System.Globalization.DateTimeFormatInfo dtf = new System.Globalization.DateTimeFormatInfo();

        if (System.DateTime.TryParse("0.5m3mmジャック付5本", dtf, System.Globalization.DateTimeStyles.None, out dtResult)) {
            Console.WriteLine("true");
        } else {
            Console.WriteLine("false");
        }
    }


(; ´ω`) ......。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-01 13:16
付け足しです。

業務では厳密さを求められるため、TryParseExact メソッドを使います。
なので、あまり気になる問題ではないですね。

とはいえ、リファレンスの内容と相反している ので不具合は不具合です。
時間がある時に調べてフィードバックしておきます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-05-01 13:41
コード:

DateTimeFormatInfo info = new CultureInfo("ja-JP").DateTimeFormat;
info.Calendar = new GregorianCalendar(GregorianCalendarTypes.USEnglish);
DateTime.TryParse("0.5m3", info, DateTimeStyles.None, out time);


引用:

System.ArgumentOutOfRangeException: 正の数値が必要です。
パラメータ名: year
場所 System.Globalization.JapaneseCalendar.ToFourDigitYear(Int32 year)
場所 System.DateTimeParse.AdjustYear(DateTimeResult& result, Int32 year)
(以下略)


えーと。USEnglish の GregorianCalendar は一体どこかな?

h/m/s/H/M/S が拙いっぽいですね。
あと ja-JP(の DateTimeFormatInfo)特有。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-05-01 15:01
IFormatProvider で見事に回避できますね。
文字列を"0年3組R・田中一郎" にしても、"0/3ページ" にしても、例外エラーは発生しませんでした。

#まだまだ修行が足りません orz

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog

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