根据社会保障号码计算年龄-如何计算
本文关键字:计算 何计算 社会保障 号码 | 更新日期: 2023-09-27 18:25:53
我对C#还很陌生,接受了这个任务。我有一个叫人的班级,里面有一些详细信息,其中一个是社会保障号码。根据这个数字,我需要计算出这个人的年龄。根据任务,如果我理解正确的话,它需要适合这个:
public class Person
{
int _Cpr;
public int Age
{
get
{
return (age calculation from cpr number somehow)
}
}
}
然而,我不知道如何做到这一点——我想我需要将形式为DDMMYYYXXXX的社会保障号码整数与当前日期进行比较,并返回四舍五入年份的差值——但我不知道该怎么做。
我开始了解如何计算年龄——我仍然不知道的是,如何将其融入我的代码中。我的描述说Age应该是一个"计算属性"-但据我所知,我无法创建变量在类定义中使用,所以我真的无法完成将Cpr转换为Age所需的所有步骤-我可以吗?
我认为这是家庭作业,所以让我试着把你推向正确的方向,而不是简单地提供答案。
你必须从社会保险号码中提取出生日期。通过用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日庆祝生日。
除了其他人写的内容外,请注意,理想情况下(为了生产使用,尽管您的作业可能不需要),您需要检查第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
检查System.DateTime并转换.ToDateTime()
我相信你可以从那里得到它。
我不会给你所需的确切代码,因为这看起来像是家庭作业,但我会给你一些线索。
首先,格式为DDMMYYYXXXX的CPR数字看起来像int,但实际上它不是一。您可以将其视为具有4个不同字段(D、M、Y、X)的结构或字符串。不过,也许最方便的可以从随后的提示中推断出来。
您可以使用ToString(字符串格式)方法将.Net中由DateTime结构表示的日期转换为字符串,在该方法中您可以指定自定义格式。您可以使用ParseExact方法执行相反的操作。
现在,如果你过生日,计算年龄应该很容易。如果我们在这一年的生日之后,它等于当前年份和出生年份之间的差异,否则就少一个。实施它应该不会太困难。