身份证号的基本知识
- 举例某个同学的身份证信息,讲解
- 前2位是省市的信息;
- 后四位是具体的乡镇信息;
- 接下来8位是生日;
- 倒数第2位表示性别;
- 最后一位是校验码;
以下为教师教学版:
package string
import java.time.LocalDate
object string04 {
def getGender(idCard:String):String = {
val gender = idCard.substring(16,17).toInt
if (gender % 2 ==0)
"女"
else
"男"
}
def getBirthdaY(idCard:String):String = {
val year = idCard.substring(6,10)
val month = idCard.substring(10,12)
val day= idCard.substring(12,14)
year+"-"+month+day
}
def getAge(idCard: String): Int = {
val year = idCard.substring(6, 10).toInt
val currentYear = LocalDate.now().getYear
currentYear - year
}
def getProvince(idCard:String):String = {
val procode = idCard.substring(0,2)
val provinceMap = Map(
"11" -> "北京市",
"12" -> "天津市",
"13" -> "河北省",
"14" -> "山西省",
"15" -> "内蒙古自治区",
"21" -> "辽宁省",
"22" -> "吉林省",
"23" -> "黑龙江省",
"31" -> "上海市",
"32" -> "江苏省",
"33" -> "浙江省",
"34" -> "安徽省",
"35" -> "福建省",
"36" -> "江西省",
"37" -> "山东省",
"41" -> "河南省",
"42" -> "湖北省",
"43" -> "湖南省",
"44" -> "广东省",
"45" -> "广西壮族自治区",
"46" -> "海南省",
"50" -> "重庆市",
"51" -> "四川省",
"52" -> "贵州省",
"53" -> "云南省",
"54" -> "西藏自治区",
"61" -> "陕西省",
"62" -> "甘肃省",
"63" -> "青海省",
"64" -> "宁夏回族自治区",
"65" -> "新疆维吾尔自治区",
"71" -> "台湾省",
"81" -> "香港特别行政区",
"82" -> "澳门特别行政区"
)
provinceMap.getOrElse(procode,"未知")
}
def main(args: Array[String]): Unit = {
val idCard = "520423200602030119"
val gender = getGender(idCard)
val birthday = getBirthdaY(idCard)
val age = getAge(idCard)
val province = getProvince(idCard)
println(s"""
性别:${gender}
生日:${birthday}
籍贯:${province}
年龄:${age}
星座:xx星座
""")
}
}
package string
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter
object string03 {
def main(args: Array[String]): Unit = {
val idCard = "520423200602030119"
if (!validateIdCard(idCard)) {
println("身份证号码格式不合法!")
return
}
val (birthday, gender, nativePlace, age, constellation) = parseIdCardInfo(idCard)
println(s"性别:$gender")
println(s"生日:$birthday")
println(s"籍贯:$nativePlace")
println(s"年龄:$age")
println(s"星座:$constellation")
}
private def validateIdCard(idCard: String): Boolean = {
if (idCard.length != 18) false
else {
try {
val birthStr = idCard.substring(6, 14)
LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd"))
true
} catch {
case _: Exception => false
}
}
}
private def parseIdCardInfo(idCard: String): (String, String, String, Int, String) = {
val birthStr = idCard.substring(6, 14)
val birthday = LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd"))
val birthdayStr = birthday.format(DateTimeFormatter.ISO_LOCAL_DATE)
val genderCode = idCard.charAt(16).toString.toInt
val gender = if (genderCode % 2 == 1) "男" else "女"
val areaCode = idCard.substring(0, 6)
val areaMap = Map(
"520000" -> "贵州省",
"520400" -> "贵州省安顺市",
"520423" -> "贵州省安顺市镇宁县"
)
val nativePlace = areaMap.getOrElse(areaCode, s"未知(区划码:$areaCode)")
val now = LocalDate.now()
val age = Period.between(birthday, now).getYears
val constellation = getConstellation(birthday)
(birthdayStr, gender, nativePlace, age, constellation)
}
private def getConstellation(birthday: LocalDate): String = {
val month = birthday.getMonthValue
val day = birthday.getDayOfMonth
(month, day) match {
case (1, 20) | (2, _) if day < 19 => "水瓶座"
case (2, 19) | (3, _) if day < 21 => "双鱼座"
case (3, 21) | (4, _) if day < 20 => "白羊座"
case (4, 20) | (5, _) if day < 21 => "金牛座"
case (5, 21) | (6, _) if day < 22 => "双子座"
case (6, 22) | (7, _) if day < 23 => "巨蟹座"
case (7, 23) | (8, _) if day < 23 => "狮子座"
case (8, 23) | (9, _) if day < 23 => "处女座"
case (9, 23) | (10, _) if day < 24 => "天秤座"
case (10, 24) | (11, _) if day < 23 => "天蝎座"
case (11, 23) | (12, _) if day < 22 => "射手座"
case _ => "摩羯座"
}
}
}