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 个字符之前测试字符串长度。

其他三个问题:

  1. AndC# 中的运算符是&&. 您正在使用&which 是按位运算符。
  2. 要检查字符串的最后四个字符,您应该使用.Length - 4,而不是5
  3. 您在 C# 中否定返回值,但在 VB 中没有。要匹配 VB,请省略!. 但是,看起来这不是你真正想要做的。如果字符串不可解析为日期或年份部分不是 4 位数字,您似乎想要显示错误消息。在这种情况下,使用 an 或比较 ( ||):
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 回答