编写程序,实现效果。
从键盘上输入一个身份证号,输出判断结果
例:
籍贯:湖北省
性别:男
年龄:40
生日:06-11
星座:巨蟹
性格:
import java.time.LocalDate
object test6 {
def main(arg: Array[String]): Unit = {
// 循环接收输入,按q退出
while (true) {
println("===== 身份证号信息解析工具 =====")
val str = scala.io.StdIn.readLine("请输入你要判断的身份证号(输入q退出):")
// 退出逻辑
if (str.equalsIgnoreCase("q")) {
println("程序已退出!")
return
}
val name = scala.io.StdIn.readLine("请输入你的姓名:")
// 1. 基础校验:身份证号长度必须为18位,且前17位为数字,第18位可以是数字或X/x
val idCardPattern = "^[1-9]\d{17}|[1-9]\d{16}[Xx]$".r
if (idCardPattern.findFirstIn(str).isEmpty) {
println("❌ 身份证号格式错误!请输入18位有效身份证号(最后一位可填X/x)")
println("----------------------------------------")
// 跳过本次循环,重新输入
continue
}
try {
// 2. 提取性别(第17位:奇数男,偶数女)
val genderCode = str.substring(16, 17).toInt
val gender = if (genderCode % 2 == 1) "男" else "女"
val genderDesc = if (genderCode % 2 == 1) "这是一个帅哥" else "这是一个美女"
// 3. 提取出生日期 & 计算年龄(6-14位:YYYYMMDD)
val birthYear = str.substring(6, 10).toInt
val birthMonth = str.substring(10, 12).toInt
val birthDay = str.substring(12, 14).toInt
val currentDate = LocalDate.now()
val currentYear = currentDate.getYear
val currentMonth = currentDate.getMonthValue
val currentDay = currentDate.getDayOfMonth
// 精确计算年龄(考虑生日是否已过)
var age = currentYear - birthYear
if (currentMonth < birthMonth || (currentMonth == birthMonth && currentDay < birthDay)) {
age -= 1
}
// 4. 提取省份(前2位)
val provinceCode = str.substring(0, 2).toInt
val provinceCodeMap: Map[Int, String] = 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 -> "澳门特别行政区"
)
val province = provinceCodeMap.getOrElse(provinceCode, "未知省份")
// 5. 星座及性格特点(完整12星座)
val constellationMap = List(
(3, 21, 4, 19, "白羊座", "直率勇敢、行动力强;短板:急躁冲动"),
(4, 20, 5, 20, "金牛座", "稳重务实、耐心坚韧;短板:固执保守"),
(5, 21, 6, 21, "双子座", "机智灵活、善于沟通;短板:三心二意"),
(6, 22, 7, 22, "巨蟹座", "温柔顾家、共情力强;短板:敏感多疑"),
(7, 23, 8, 22, "狮子座", "自信大方、热情慷慨;短板:骄傲自负"),
(8, 23, 9, 22, "处女座", "严谨细致、追求完美;短板:挑剔苛刻"),
(9, 23, 10, 23, "天秤座", "优雅公正、善于协调;短板:犹豫不决"),
(10, 24, 11, 22, "天蝎座", "敏锐执着、洞察力强;短板:记仇多疑"),
(11, 23, 12, 21, "射手座", "乐观自由、热爱冒险;短板:粗心浮躁"),
(12, 22, 1, 19, "摩羯座", "自律务实、野心勃勃;短板:严肃压抑"),
(1, 20, 2, 18, "水瓶座", "独立创新、理性包容;短板:冷漠疏离"),
(2, 19, 3, 20, "双鱼座", "慈悲浪漫、共情力强;短板:情绪化")
)
// 获取星座和性格特点的方法
def getConstellationAndTrait(month: Int, day: Int): (String, String) = {
constellationMap.find { case (sM, sD, eM, eD, _, _) =>
if (sM > eM) { // 跨年度星座(摩羯座)
(month == sM && day >= sD) || (month == eM && day <= eD)
} else { // 普通星座
(month > sM && month < eM) || (month == sM && day >= sD) || (month == eM && day <= eD)
}
}.map(c => (c._5, c._6)).getOrElse(("未知星座", "无数据"))
}
// 计算星座和性格
val (constellation, traitDesc) = getConstellationAndTrait(birthMonth, birthDay)
// 6. 输出所有信息
println("----------------------------------------")
println(s"姓名:$name")
println(s"性别:$gender ($genderDesc)")
println(s"出生日期:${birthYear}年${birthMonth}月${birthDay}日")
println(s"年龄:${age}岁")
println(s"籍贯:$province")
println(s"星座:$constellation")
println(s"性格特点:$traitDesc")
println("----------------------------------------")
} catch {
// 捕获数字转换、字符串截取等异常
case e: Exception =>
println(s"❌ 解析失败:${e.getMessage},请检查身份证号是否正确!")
println("----------------------------------------")
}
}
}
// Scala中没有continue,自定义continue方法(利用breakable实现)
import scala.util.control.Breaks
private def continue(): Unit = Breaks.break()
}
输出结果:
===== 身份证号信息解析工具 =====
请输入你要判断的身份证号(输入q退出):420006200203053311
请输入你的姓名:小帅
----------------------------------------
姓名:小帅
性别:男 (这是一个帅哥)
出生日期:2002年3月5日
年龄:23岁
籍贯:湖北省
星座:双鱼座
性格特点:慈悲浪漫、共情力强;短板:情绪化
----------------------------------------