# # TextChanged方法的过期日期的正则表达式:IndexOutOfRangeException:索引超出了数

本文关键字:索引 正则表达式 TextChanged 方法 过期 日期 IndexOutOfRangeException | 更新日期: 2023-09-27 18:08:57

我正在Xamarin上创建应用程序,在Entry上我创建了这个方法:

private void expiry_TextChanged(object sender, TextChangedEventArgs e)
{
    var monthCheck = new Regex(@"^(0[1-9]?|1[0-2]?)$");
    var yearCheck = new Regex(@"^(1[6-9]?|2[0-9]?)$");
    var dateParts = expiry.Text.Split('/');
    if (!monthCheck.IsMatch(dateParts[0]) || !yearCheck.IsMatch(dateParts[1]))
    {
        return;
    }
    var year = int.Parse(dateParts[1]);
    var month = int.Parse(dateParts[0]);
    var lastDateOfExpiryMonth = DateTime.DaysInMonth(year, month);
    var cardExpiry = new DateTime(year, month, lastDateOfExpiryMonth, 23, 59, 59);
    int sizeLength = 4;
    string tmpText = expiry.Text.Replace("/", "");
    if (tmpText.Length > sizeLength)
    {
        expiry.Text = expiry.Text.Remove(expiry.Text.Length - 1);
        return;
    }
    if (tmpText.Length > 0 && (expiry.Text.Length % 3 == 0) && expiry.Text.Substring(expiry.Text.Length - 1, 1) != "/" && expiry.Text.Substring(expiry.Text.Length - 2, 1) != "/")
    {
        expiry.Text = string.Concat(expiry.Text.Substring(0, expiry.Text.Length - 1), "/", expiry.Text.Substring(expiry.Text.Length - 1, 1));
    }
}

if (!monthCheck.IsMatch(dateParts[0]) || !yearCheck.IsMatch(dateParts[1]))上,我得到的错误是索引在边界之外,但如果我只添加符号到我的到期条目字段,这是怎么可能的?

# # TextChanged方法的过期日期的正则表达式:IndexOutOfRangeException:索引超出了数

方法ExpDate_TextChanged正在被调用,一旦有人进入TextField的第一个字符,它正在被调用为每个以下字符。我猜默认情况下它是空的,所以这个方法的第一次调用发生在TextField中还没有"/"的时候。

将当前在ExpDate_TextChanged中的代码移动到Button中,以便在输入完成时执行。并在访问dateParts:

中的任何元素之前添加一个完整性检查
if (dateParts.Length < 2)
   return;
}

请注意,有更好的方法来解析日期,如DateTime.TryParse(),我强烈推荐

Me:

您仍然没有添加示例日期。什么可以过期。文本是什么?

:

例如,可以是01/17

如果那是2017年1月,到期时间应该是:new DateTime(2017,1,31,23,59,59))(所以那个月底),你可以使用DateTime.TryParseExact:

DateTime cardExpiry;
bool validDate = DateTime.TryParseExact(expiry.Text, "MM/yy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out cardExpiry);
if (!validDate)
{
    MessageBox.Show("Enter a valid card expiry month in the format 'MM/yy', for example 01/17");
    return;
}
cardExpiry = cardExpiry.AddMonths(1).AddSeconds(-1); // last date of month, 23:59:59
// ...

感谢大家的帮助和建议,但不幸的是我用另一种方式解决了这个问题:首先我检查dateParts是否大于0,而是检查(dateParts.Length < 2)。最后的代码是这样的:

var dateParts = expiry.Text.Split('/');
if(dateParts.Length>0)
            {
               if(!monthCheck.IsMatch(dateParts[0]) && dateParts[0] != "")
                {
                    if (dateParts[0].Length > 0)
                        dateParts[0] = dateParts[0].Substring(0, dateParts[0].Length - 1);
                }
                else
                {
                    if(dateParts[0].Length==2)
                        dateParts[0] = dateParts[0]+ "/";     
                }
                if(dateParts.Length > 1)
                {
                    if (!yearCheck.IsMatch(dateParts[1]) && dateParts[1] != "")
                    {
                        if (dateParts[1].Length > 0)
                            dateParts[1] = dateParts[1].Substring(0, dateParts[1].Length - 1);
                    }
                }
            }