案例实现:输入身份证号输出基本信息

49 阅读1分钟

编写程序,实现效果。

从键盘上输入一个身份证号,输出判断结果

例:

籍贯:湖北省

性别:男

年龄: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
请输入你的姓名:小帅
----------------------------------------
姓名:小帅
性别:男 (这是一个帅哥)
出生日期:200235日
年龄:23岁
籍贯:湖北省
星座:双鱼座
性格特点:慈悲浪漫、共情力强;短板:情绪化
----------------------------------------