Scala | String从身份证号中 解析出基本信息

36 阅读3分钟

案例:

  • (1) 省份:42 湖北 , 43 湖南 , 11 北京
  • (2) 市区 乡镇 4209
  • (3) 出生年份:1986
  • (4) 出生日期:0228
  • (5) 顺序码:00
  • (6) 倒数第二位 5 ,(奇数男、偶数女)
  • (7) 最后一位:校验码,验证这个身份证号是不是瞎编的

分解代码:

读取性别
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 getProvince(idCard: String): String = {
  val procode = idCard.substring(0,2)
  // 14 --> 山西省
  val provinceMap = Map(
    // 直辖市
    "11" -> "北京市",
    "12" -> "天津市",
    "31" -> "上海市",
    "50" -> "重庆市",

    // 省份
    "13" -> "河北省",
    "14" -> "山西省",
    "15" -> "内蒙古自治区",
    "21" -> "辽宁省",
    "22" -> "吉林省",
    "23" -> "黑龙江省",
    "32" -> "江苏省",
    "33" -> "浙江省",
    "34" -> "安徽省",
    "35" -> "福建省",
    "36" -> "江西省",
    "37" -> "山东省",
    "41" -> "河南省",
    "42" -> "湖北省",
    "43" -> "湖南省",
    "44" -> "广东省",
    "45" -> "广西壮族自治区",
    "46" -> "海南省",
    "51" -> "四川省",
    "52" -> "贵州省",
    "53" -> "云南省",
    "54" -> "西藏自治区",
    "61" -> "陕西省",
    "62" -> "甘肃省",
    "63" -> "青海省",
    "64" -> "宁夏回族自治区",
    "65" -> "新疆维吾尔自治区",

    // 特别行政区
    "71" -> "台湾省",
    "81" -> "香港特别行政区",
    "82" -> "澳门特别行政区"
  )
  provinceMap.getOrElse(procode, "未知")
}

读取年龄

def getAge(idCard: String): Int = {
  val year = idCard.substring(6, 10).toInt
  // 获取当前年份
  val currentYear = LocalDate.now().getYear
  currentYear - year
}

读取星座

def getZodiac(idCard:String): String = {
  val month = idCard.substring(10,12).toInt
  val day = idCard.substring(12,14).toInt
  val zodiacs = Array("摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座")
  val boundaries = Array(1222, 120, 219, 321, 420, 521, 622, 723, 823, 923, 1023, 1122)
  val date = month * 100 + day
  val index = boundaries.search(date).insertionPoint
  zodiacs(index)
}

完整代码:

object string02 {

  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)
    // 14 --> 山西省
    val provinceMap = Map(
      // 直辖市
      "11" -> "北京市",
      "12" -> "天津市",
      "31" -> "上海市",
      "50" -> "重庆市",

      // 省份
      "13" -> "河北省",
      "14" -> "山西省",
      "15" -> "内蒙古自治区",
      "21" -> "辽宁省",
      "22" -> "吉林省",
      "23" -> "黑龙江省",
      "32" -> "江苏省",
      "33" -> "浙江省",
      "34" -> "安徽省",
      "35" -> "福建省",
      "36" -> "江西省",
      "37" -> "山东省",
      "41" -> "河南省",
      "42" -> "湖北省",
      "43" -> "湖南省",
      "44" -> "广东省",
      "45" -> "广西壮族自治区",
      "46" -> "海南省",
      "51" -> "四川省",
      "52" -> "贵州省",
      "53" -> "云南省",
      "54" -> "西藏自治区",
      "61" -> "陕西省",
      "62" -> "甘肃省",
      "63" -> "青海省",
      "64" -> "宁夏回族自治区",
      "65" -> "新疆维吾尔自治区",

      // 特别行政区
      "71" -> "台湾省",
      "81" -> "香港特别行政区",
      "82" -> "澳门特别行政区"
    )
    provinceMap.getOrElse(procode, "未知")
  }

  def getZodiac(idCard:String): String = {
    val month = idCard.substring(10,12).toInt
    val day = idCard.substring(12,14).toInt
    val zodiacs = Array("摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座")
    val boundaries = Array(1222, 120, 219, 321, 420, 521, 622, 723, 823, 923, 1023, 1122)
    val date = month * 100 + day
    val index = boundaries.search(date).insertionPoint
    zodiacs(index)
  }


  def main(args: Array[String]): Unit = {
    val idCard = "110723200609130000"

    val gender = getGender(idCard)
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac = getZodiac(idCard)

    // 输出一些基本的信息

    println(
      s"""
      性别:${gender}
      生日:${birthday}
      籍贯:${province}
      年龄:${age}
      星座:${zodiac}
      """)

  }
}

代码运行:

屏幕截图 2025-12-15 083641.png