# # 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]))
上,我得到的错误是索引在边界之外,但如果我只添加符号到我的到期条目字段,这是怎么可能的?
方法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);
}
}
}