Scala研究身份证中的秘密

45 阅读3分钟

身份证的基本信息

前2位是省市的信息;

后四位是具体的乡镇信息;

接下来8位是生日;

倒数第2位表示性别;

最后一位是校验码; image.png

package string

import java.time.Year

object string03 {
  def main(args: Array[String]): Unit = {
    // 省份编码映射表(完整覆盖全国34个省级行政区)
    val provinceCodeMap: Map[String, String] = Map(
      "11" -> "北京市",
      "12" -> "天津市",
      "13" -> "河北省",
      "14" -> "山西省",
      "15" -> "内蒙古自治区",
      "21" -> "辽宁省",
      "22" -> "吉林省",
      "23" -> "黑龙江省",
      "31" -> "上海市",
      "32" -> "江苏省",
      "33" -> "浙江省",
      "34" -> "安徽省",
      "35" -> "福建省",
      "36" -> "江西省",
      "37" -> "山东省",
      "41" -> "河南省",
      "42" -> "湖北省",
      "43" -> "湖南省",
      "44" -> "广东省",
      "45" -> "广西壮族自治区",
      "46" -> "海南省",
      "50" -> "重庆市",  // 注意:重庆编码是50,不是30
      "51" -> "四川省",
      "52" -> "贵州省",
      "53" -> "云南省",
      "54" -> "西藏自治区",
      "61" -> "陕西省",
      "62" -> "甘肃省",
      "63" -> "青海省",
      "64" -> "宁夏回族自治区",
      "65" -> "新疆维吾尔自治区",
      "71" -> "台湾省",
      "81" -> "香港特别行政区",
      "82" -> "澳门特别行政区"
    )
    val constellationInfo: List[((Int, Int), (Int, Int), String, String)] = 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), "双鱼座", "温柔浪漫、爱幻想,敏感且容易情绪化")
    )
    while (true){
      val str = scala.io.StdIn.readLine("请输入你要判断的身份证号:")
      //判断是否为18位
      if(str.length == 18){
        //性别
        val x = str.substring(16,17)//获取倒数第二位
        val y = x.toInt//将倒数第二位变为数字,并判断奇偶,奇为男,偶为女
        if (y % 2 ==1){
          println("这是一个大帅哥")
        }else{
          println("这是一个小姑娘")}
        //判断年龄
        val n = str.substring(6,10)//从身份证中获取出生年份
        val m =n.toInt//将出生年份转换为数字
        val age= Year.now().getValue() - m //当前年份( Year.now().getValue())-出生年份
        println(s"年龄为${age}岁")
        //判断省份
        val provinceCode = str.substring(0,2)//从身份证中获取省份
        val province = provinceCodeMap.getOrElse(provinceCode, s"未知省份(编码:$provinceCode)")
        println(s"所属省份:$province")
        //判断星座
        val birthMonth = str.substring(10, 12).toInt // 提取出生月份(第11-12位)
        val birthDay = str.substring(12, 14).toInt   // 提取出生日期(第13-14位)
        // 遍历星座列表匹配
        var constellation = "未知星座"
        var traitDesc = "无性格信息"
        for (((startM, startD), (endM, endD), name, traitStr) <- constellationInfo) {
          if (startM <= endM) {
            // 同年度区间(如3.21-4.19)
            if ((birthMonth == startM && birthDay >= startD) ||
              (birthMonth == endM && birthDay <= endD) ||
              (birthMonth > startM && birthMonth < endM)) {
              constellation = name
              traitDesc = traitStr
            }
          } else {
            // 跨年度区间(如12.22-1.19)
            if ((birthMonth == startM && birthDay >= startD) ||
              (birthMonth == endM && birthDay <= endD)) {
              constellation = name
              traitDesc = traitStr
            }
          }
        }
        println(s"星座:$constellation")
        println(s"性格特点:$traitDesc")
      }else{
        println(s"${str}不是一个合法的身份证号,长度不对")
      }
    }
  }
}