1

正しい日付形式が入力されていることを確認するために、日付テキスト ボックスを検証しようとしています。

このvb6コードを変換しました:

If (IsDate(txtBirthDate)) And (IsNumeric(Right(txtBirthDate, 4))))

このC#コードに -

int output = 1;
DateTime output2;

if ((! DateTime.TryParse(txtBirthDate.Text, out output2)) & (!int.TryParse((txtBirthDate.Text.Substring(txtBirthDate.Text.Length - 5)), out output))) 
{
    MessageBox.Show("error")
}

私がやろうとしているのは、日付テキスト ボックスの下 4 桁が数字 (年 - 1990 年 5 月 10 日 1990 年) であることを確認することです。数字でない場合はエラーを表示します。日付形式に「/」があるため、すべてが数値であることを確認することはできませんが。

コードはエラーを表示せず、ビルドされます。しかし、アプリケーションをデバッグするとエラーが発生します。エラーは次のように述べています。

インデックスと長さは、文字列内の場所を参照する必要があります。
パラメータ名: 長さ。

これを達成する方法についてのアイデアはありますか?

4

4 に答える 4

3

日付が特定の形式であるかどうかを確認するには、次を使用しますDateTime.TryParseExact()

if (!DateTime.TryParseExact(output , "d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out output2)) 
{
    MessageBox.Show("error")
}

編集:必要に応じてフォーマットを変更してください:

"d/M/yyyy"英国"M/d/yyyy"向けおよび米国向け

于 2012-07-18T17:37:22.410 に答える
2

編集:エラーの原因は、文字列が短すぎることです。最後の 4 文字をテストする前に、文字列の長さをテストします。

その他の 3 つの問題:

  1. C#のAnd演算子は&&. &ビット単位の演算子を使用しています。
  2. 文字列の最後の 4 文字を確認するには.Length - 4、 ではなくを使用する必要があります5
  3. C# では戻り値を否定していますが、VB では否定していません。VB に合わせるには、!. しかし、それはあなたが実際にやろうとしていることではないようです。文字列が日付として解析できない場合、または年の部分が 4 桁でない場合にエラー メッセージを表示したいようです。その場合は、または比較 ( ||)を使用します。
if (!DateTime.TryParse(txtBirthDate.Text, out output2) ||
    txtBirthDate.Text.Length < 4 ||
    !int.TryParse((txtBirthDate.Text.Substring(txtBirthDate.Text.Length - 4)), out output))
{
    MessageBox.Show("error")
}

yyyy/M/d日付としても解析可能で、4 桁の年が含まれていますが、テストに失敗することに注意してください。それはあなたが望むものですか?

于 2012-07-18T17:35:09.767 に答える
0
        int result;
        if (int.TryParse(txtBirthDate.Text.Substring(test.LastIndexOf("/")), out result))
        {
           //its good
        }
        else
        {
            //its bad
        }
于 2012-07-18T17:37:58.243 に答える
0

提供されたエラーから、コードを処理できることを確認するために長さのチェックが必要なようです。& (またはこの場合はおそらく ||) の代わりに && を使用して、真の状態になったときにブール式の実行を確実に停止する必要があります。

if (txtBirthDate.Text.Length < 5 ||
   (!DateTime.TryParse(txtBirthDate.Text, out output2) ||   
    !int.TryParse((txtBirthDate.Text.Substring(txtBirthDate.Text.Length - 5)), out output))) 
{
    MessageBox.Show("error")
}

ただし、これは正規表現を使用する場合に適している場合があります。

Regex reg = new Regex("^\d{2}/\d{2}/\d{4}$");

if (!reg.IsMatch(txtBirthDate.Text))
    MessageBox.Show("error");

フリンジ ケース (先行ゼロ、代替形式など) に一致するように正規表現を微調整する必要がある場合があります。

于 2012-07-18T17:41:43.247 に答える