2012-02-26 51 views
1

我對C#很陌生,並且完成了這項任務。我有一個叫做人的課,有一些細節,其中一個是社會安全號碼(CPR號碼)。從這個數字我需要計算這個人的年齡。它需要適應這一點,根據分配,如果我的理解對不對:從社會安全號碼計算年齡 - 如何?

public class Person 
{ 
    int _Cpr; 

    public int Age 
    { 
     get 
     { 
      return (age calculation from cpr number somehow) 
     } 
    } 
} 

但是我不知道怎麼做 - 我猜我需要比較有這種形式的社會安全號碼整數:DDMMYYXXXX到當前日期,並返回舍入年份的差異 - 但我不知道如何去做。


我開始把圖像看作是如何計算年齡 - 我仍然失去了什麼,是如何適應我的代碼。我所說的描述是年齡應該是一個「計算的屬性」 - 但我不能創建變量在類定義中使用,據我所知,所以我不能做所有必要的步驟使Cpr成爲年齡 - 我可以嗎?

回答

2

我認爲這是作業,所以讓我試着把你推向正確的方向,而不是簡單地提供答案。

你必須從社會安全號碼中提取出生日期。通過以10的冪數進行整數除法,您可以從右邊「砍」數字。通過10次冪做模運算,你可以讓你需要的位數:

123456/100 = 1234 
1234%100 = 34 

在C#中,你可以使用DateTime類來表示一個時間點(如出生日期)。字段DateTime.Now包含當前時間。

您希望得到年齡(向下取整),因此您將減去兩個DateTime值的Year屬性。如果這個人今年已經過了他的生日,你還必須考慮到這一點。


擾流板提前

最大的CPR是3112999999,這個數字實際上比Int32.MaxValue大。這意味着您必須將_Cpr的類型更改爲uint(或long)。下面的代碼還考慮了TheKaneda描述的從兩位數年份開始計算四位數年份的規則。

public class Person  
{  
    uint _Cpr;  

    public int Age  
    {  
    get  
    {  
     int century = (int) ((cpr/1000)%10); 

     int shortBirthYear = (int) ((cpr/10000)%100); 
     int birthYear = 1900 + shortBirthYear; 
     if ((century == 4 || century == 9) && shortBirthYear <= 36) 
     birthYear += 100; 
     else if (5 <= century && century <= 8 && shortBirthYear <= 57) 
     birthYear += 100; 

     int birthMonth = (int) ((cpr/1000000)%100); 

     int birthDayOfMonth = (int) ((cpr/100000000)); 

     DateTime birthDate = new DateTime(birthYear, birthMonth, birthDayOfMonth); 
     DateTime today = DateTime.Now.Date; 
     DateTime birthDay = new DateTime(today.Year, birthMonth, birthDayOfMonth); 

     int birthdayAdjustment = today < birthDay ? -1 : 0; 
     int age = today.Year - birthDate.Year + birthdayAdjustment; 
    } 
    } 
} 

即使代碼是極其複雜的,當一個人在2月29日出生的提高代碼應該重構到與提取出生日期和計算涉及獨立的部分不處理的情況年齡。最後一部分應該處理2月29日的問題,並根據文化,你可能會發現在非閏年出生於2月29日的人慶祝他們的生日2月28日。

+0

我跟着你,直到這一點: 「生日-1:0;?」 - 我沒有使用該運營商還沒有 - 我somehing錯的,我認爲這是inpossible聲明變量的一類 – Treelink 2012-02-26 02:01:55

+0

@Treelink內使用:我已刪除的條件運算符。你可以在這裏讀到它:http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.100).aspx – 2012-02-26 02:06:34

+0

其實我想我明白這個代碼 - 我滿腦子都是我 - 唐't知道 - 什麼,但我明白了,我想我可以重現 - 謝謝! :)(我真的不知道這是可以做到這樣的,我從來沒有工作過氣出在我自己的!) – Treelink 2012-02-26 02:09:32

2

除了別人寫的東西, (對於生產用途,儘管您的任務可能不需要它),但您需要檢查第七位數字以解釋出生世紀。

ddmmyy-Cxxx 
C = 0-3 => person was born in the 1900's 
C = 4 or 9 => person was born either 2000-2036 or 1937-1999 
C = 5-8 => person was born either 2000-2057 or 1858-1899 
+0

的確,對於一個真正的丹麥的社會安全號碼,你必須這樣,但顯然這個任務它已被重新定義爲四位數的DDMMYYYYXXXX,可能會避免增加這種複雜性。 – 2012-02-26 01:57:08

+0

啊,對 - 這很可能 - 刪除了我對你答案的評論,以避免混淆。 – JimmiTh 2012-02-26 02:03:42

+0

剛剛更新,CPR號在丹麥確實只有10位數字。我的錯誤:-) – Treelink 2012-02-26 02:05:20

0

我不會給你確切的代碼,因爲這看起來像功課,但我會給你一些線索。

首先,在格式的CPR號碼DDMMYYYYXXXX看起來像一個int,但實際上卻是一個也沒有。你可以把它看作是一個具有4個不同域(D,M,Y,X)的結構或者一個字符串。不過,也許最方便的可以從隨後的提示中獲得。

您可以將.Net中由DateTime結構表示的日期轉換爲ToString(string format)方法中的字符串,您可以指定自定義格式。您可以使用ParseExact方法做相反的處理。現在

如果你有一個生日,計算年齡應該是很容易的。如果我們在今年的生日之後,它等於今年和出生年份之間的差額,否則等於一年。實施它不應該太困難。