2009-08-21 74 views
1

任何人都可以請解釋下面的代碼檢查什麼?我無法理解它,但不想因爲無知而忽略它。完整的代碼計算現在和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"; 
} 

新增:令我百思不解的是,爲什麼它解析字符0〜3次。

+0

雙解析確實很奇怪,但我沒有任何目的。 'num3'只與0比較,所以沒有區別。除非在以後的其他地方使用'num3',但我無法想象爲什麼。 – Thorarin 2009-08-21 07:30:13

回答

1

它看起來像它的檢查,看看日期爲全零,如果是,則默認爲991231(1999年12月31日?)

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的答案。只要確保周圍的代碼不依賴我描述的副作用。

+0

如果您需要比較的是0,那麼您並不需要任何詳細的代碼,只是這樣:if(detailLastDate ==「000000」) – 2009-08-21 06:12:28

+0

您是否真正閱讀過我寫的內容?我試圖指出重構這個可能的陷阱。我提供了一個相對安全的替代品。如果你只是想幹淨的代碼和副作用是不相關的,那麼是的。OP將是最好的評判者,因爲他擁有所有的代碼。再說一遍,如果它是**很好的代碼,爲什麼字符串中的日期在第一位? – Thorarin 2009-08-21 06:31:12

+0

我將讀取所有解析並使用適當的該死的日期字段,但我想知道是否有任何理由'校驗和'包含數字0到3兩次。 – ProfK 2009-08-21 06:43:22

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; 
+0

是的,那將是最明智的解決方案。原代碼有一些副作用,但是這個代碼不會。您需要確保周圍的代碼不依賴於這些副作用。這就是爲什麼我發佈我的「大部分等效」代碼。 – Thorarin 2009-08-21 06:06:20

+1

您需要幾個月的MM - 目前您正在分析年份,*分鐘*和日期。 – 2009-08-21 06:13:12

+0

謝謝@Jon沒有注意到 – CMS 2009-08-21 06:15:53

1

那麼,首先所有的代碼不編譯因爲括號不匹配。原始代碼是什麼樣的?

如果添加括號,代碼仍然沒有多大意義。它一次解析一個字符,並且不止一次地解析大多數字符,而只能解析整個字符串。

如果您知道該字符串始終是六個字符,總是包含數字,你不需要額外的驗證,該代碼給出瞭解析字符串,你可以將其替換爲:

if (detailLastDate == "000000") detailLastDate = "991231";