有人可以解释以下代码检查的内容吗?我不能理解它,但不想因为无知而把它从我的重写中删除。完整代码计算现在与detailLastDate
之间的差异,即Days(detailLastDate) - Days(Now)
。对于这种情况,detailLastDate
的值为'090722':
int num3 = 0;
num3 = int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(4, 1)
+ int.Parse(detailLastDate.Substring(0, 1) + int.Parse(detailLastDate.Substring(1, 1) + int.Parse(detailLastDate.Substring(2, 1) + int.Parse(detailLastDate.Substring(3, 1) + int.Parse(detailLastDate.Substring(5, 1);
if (num3 == 0)
{
detailLastDate = "991231";
}
ADDED:令我困惑的是为什么它会两次解析字符0到3。
答案 0 :(得分:5)
嗯,难怪你无法理解它,因为它毫无意义:)
首先,它的目的似乎是检查传递的日期是否为“000000”。它还会检查所有数字是否实际上都是数字。如果他们不是,那将是一个例外。如果字符串的长度小于6,也会有例外。
如果日期为“000000”,则默认为“991231”。
这应该是大多数等价,假设num3
不用于其他奇怪的比较:
int num3;
if (detailLastDate.Length != 6 || !Int32.TryParse(detailLastDate, out num3))
throw new FormatException("Invalid date");
if (num3 == 0)
detailLastDate = "991231";
字符串上的错误太长了(与你的代码片段不同),但我认为这是一件好事。就个人而言,我完全摆脱了整数解析,但我猜它有效:)
如果你想以正确的方式进行一些重构,请看看CMS的回答。请确保周围的代码不依赖于我描述的副作用。
答案 1 :(得分:2)
您可以根据格式yyMMdd
解析日期,并使用DateTime.TryParseExact方法查看转换是否成功。
一个例子:
//...
string detailLastDate = "090722";
DateTime lastDate;
if (!DateTime.TryParseExact(detailLastDate, "yyMMdd",
CultureInfo.InvariantCulture, DateTimeStyles.None, out lastDate))
{
// input doesn't match the format
lastDate = new DateTime(1999, 12, 31); // default value 991231
}
//...
return (lastDate - DateTime.Today).Days;
答案 2 :(得分:1)
它看起来像检查日期是否全是零,如果是,默认为991231(1999年12月31日?)
答案 3 :(得分:1)
好吧,首先代码不能编译,因为括号不匹配。原始代码是什么样的?
如果添加括号,代码仍然没有多大意义。它只是一次解析一个字符而且多次解析大多数字符,而它只能解析整个字符串。
如果你知道字符串总是六个字符并且总是包含数字,那么你不需要通过解析字符串来提供代码所提供的额外验证,你只需将其替换为:
if (detailLastDate == "000000") detailLastDate = "991231";