2012-02-26 11 views
1

私はC#にはかなり新しく、この割り当てを受けました。私には、社会保障番号(CPR番号)である詳細のある人と呼ばれるクラスがあります。この数字から、私はこの人の年齢を計算する必要があります。私は推測している私は、この形状を有する社会保障番号の整数を比較する必要がある - 私はしかし、どのようにそれを行うには考えている 社会保障番号からの年齢の計算 - どのように?

public class Person 
{ 
    int _Cpr; 

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

:それは私が右のそれを理解していれば、割り当てに従って、この中にフィットする必要があります:DDMMYYXXXXを現在の日付に戻し、切り捨てられた年の差を返します。しかし、どうすればいいのか分かりません。


私は年齢を計算する方法として、画像を取得するために始めている - 私はまだ上の失われたよ何が、私が持っているコードにこれに合うようにする方法です。私は、年齢は "計算されたプロパティ"でなければならないと言っていますが、クラス定義内で使用する変数を私が知る限り作成す​​ることはできないため、Cprを作成するために必要なすべての手順を実際に行うことはできません年齢 - できますか?

答えて

2

私はこれが宿題なので、答えを提示するのではなく正しい方向にあなたを押し込もうとします。

社会保障番号から誕生日を抽出する必要があります。 10の累乗で整数の除算を行うことによって、右から数字の「チョップ」を行うことができます。あなたは、時間(例えば誕生日)にポイントを表すためにDateTimeクラスを使用することができますC#では

123456/100 = 1234 
1234%100 = 34 

:10の力によって剰余演算を行うことで、あなたが必要な桁数を保つことができます。フィールドDateTime.Nowには現在の時刻が含まれます。

あなたは年に年齢を取得したい(切り捨て)ので、次の2つのDateTime値のYearプロパティをsubstractています。今年も誕生日を迎えていれば、それを考慮する必要があります。先に


スポイラー

最大のCPRは3112999999で、その数はInt32.MaxValueよりも実際に大きくなっています。つまり、_Cprのタイプをuint(またはlong)に変更する必要があります。以下のコードはTheKanedaが2桁の年の4桁の年を取得するためのルールも考慮しています。コードは、人はそれが誕生日を抽出し、計算を扱う別々の部分にリファクタリングする必要があるコードを向上させるために2月29日に生まれているとき、それは状況を処理しない驚くほど複雑であるにもかかわらず

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月28日に誕生日を祝うことを発見するかもしれません。

+0

「birthDay?-1:0;」までこれまであなたにフォローしていました。 - 私はまだその演算子を使用していない - 私は間違っているが、私はそれがクラス内で使用する変数を宣言することは不可能だと思った – Treelink

+0

@Treelink:私は条件演算子を削除しました。あなたはそれについてここで読むことができます:http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.100).aspx –

+0

私は実際に私はこのコードを理解すると思う - 私の頭は私はドンでいっぱいです't-know-what、しかし私はそれを取得し、私は再現できると思う - ありがとう! :)実際にデンマークの社会保障番号については、あなたはこれをする必要がありますが、明らかにこの課題のためにはありますが(実際には、このようにすることはできませんでしたが、私は決してそれを働かせることはできませんでした!) – Treelink

2

他にも書いたことに加えて、 (プロダクション用には、あなたの課題には必要ないかもしれませんが)、出生の世紀を説明するために7桁目をチェックする必要があります。

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として4桁の年に再定義されました。 –

+0

ああ、そうだね - 混乱を避けるためにあなたの答えに対するコメントを削除した。 – JimmiTh

+0

ちょうど更新された、CPR番号は確かにデンマークで合計10桁しか持っていません。私の間違い:-) – Treelink

0

これは宿題のように見えるので、必要な正確なコードは提供しませんが、私はあなたにいくつかの手がかりを与えます。

最初に、DDMMYYYYXXXX形式のCPR番号は、intのように見えますが、実際は1ではありません。 4つの異なるフィールド(D、M、Y、X)を持つ構造体または文字列として見ることができます。しかし、最も便利なのは後のヒントから推測することができるかもしれません。

DateTime構造体で表される.Netの日付を、ToString(string format)メソッドの文字列に変換して、カスタム形式を指定することができます。逆戻りはParseExactの方法で行うことができます。

誕生日をお持ちの場合は、年齢の計算は非常に簡単です。今年の誕生日を迎えていれば今年と誕生年の差、それ以外の場合は差異に等しい。それを実装することはそれほど難しいことではありません。

関連する問題