字符串——身份证的秘密

27 阅读3分钟
object class1 {
  def main(args: Array[String]): Unit = {

    val str = "hello scala"

    println(str.length)
    println(str(0))

    //2.取出“llo”这三个字符串
    println( str.substring(2,5) )

    //取出“cal”这三个字符
    println( str.substring(7,10))
  }
}

案例:拆分身份证号的秘密

  1. 倒数第二个数 奇数:男;偶数:女
object class2{
  def getGender(idCard:String):String = {
    val g = idCard.substring(16,17).toInt
    if(g % 2 == 1){
      "男"
    }else{
      "女"
    }
  }
  def main(args: Array[String]): Unit = {
    val idCard = "320324200606214419"

    val gender = "女"
    val birthday = "06.21"
    val age = 19
    val province = "湖北"
    val zodiac= "双子"

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

}

若想用身份证号码知道籍贯

object class2{
  def getGender(idCard:String):String = {
    val g = idCard.substring(16,17).toInt
    if(g % 2 == 1){
      "男"
    }else{
      "女"
    }
  }
  def getProvince(idCard:String):String = {
    val code = idCard.substring(0,2)
    val map = 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"->"澳门")
    map.getOrElse(code,"未知")
  }
  def main(args: Array[String]): Unit = {
    val idCard = "320324200606214419"

    val gender = "女"
    val birthday = "06.21"
    val age = 19
    val province = getProvince(idCard)
    val zodiac= "双子"

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

}

image.png

当然,可以以此类推,来知道生日,星座,年龄

  1. 我将身份证号改成320324200603034419
  2. 输出结果改变成“03.03”和“双鱼座”
import java.time.LocalDate

object class2{
  def getGender(idCard:String):String = {
    val g = idCard.substring(16,17).toInt
    if(g % 2 == 1){
      "男"
    }else{
      "女"
    }
  }
  def getProvince(idCard:String):String = {
    val code = idCard.substring(0,2)
    val map = 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"->"澳门")
    map.getOrElse(code,"未知")
  }
  def getAge(idCard: String): Int = {
    // 从身份证号中截取出生年份(假设身份证号是18位,年份在第7-10位)
    val year = idCard.substring(6, 10)
    // 获取当前年份,计算年龄
    LocalDate.now().getYear() - year.toInt
  }
  def getBirthday(idCard: String): String = {
    val month = idCard.substring(10,12)
    val day = idCard.substring(12,14)
    month + "-" + day
  }

  def getZodiac(idCard: String): String = {
    val month = idCard.substring(10,12).toInt
    val day = idCard.substring(12,14).toInt

    if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) "水瓶座"
    else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) "双鱼座"
    else if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) "白羊座"
    else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) "金牛座"
    else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) "双子座"
    else if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) "巨蟹座"
    else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) "狮子座"
    else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) "处女座"
    else if ((month == 9 && day >= 23) || (month == 10 && day <= 22)) "天秤座"
    else if ((month == 10 && day >= 23) || (month == 11 && day <= 21)) "天蝎座"
    else if ((month == 11 && day >= 22) || (month == 12 && day <= 21)) "射手座"
    else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) "摩羯座"
    else "未知"
  }
  def main(args: Array[String]): Unit = {
    val idCard = "320324200603034419"
    val gender = "女"
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac= getZodiac(idCard)

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

}

屏幕截图 2025-12-17 101627.png

  • 我们还可以加一个“星座性格”
import java.time.LocalDate

object class2{
  def getGender(idCard:String):String = {
    val g = idCard.substring(16,17).toInt
    if(g % 2 == 1){
      "男"
    }else{
      "女"
    }
  }
  def getProvince(idCard:String):String = {
    val code = idCard.substring(0,2)
    val map = 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"->"澳门")
    map.getOrElse(code,"未知")
  }
  def getAge(idCard: String): Int = {
    // 从身份证号中截取出生年份(假设身份证号是18位,年份在第7-10位)
    val year = idCard.substring(6, 10)
    // 获取当前年份,计算年龄
    LocalDate.now().getYear() - year.toInt
  }
  def getBirthday(idCard: String): String = {
    val month = idCard.substring(10,12)
    val day = idCard.substring(12,14)
    month + "-" + day
  }

  def getZodiac(idCard: String): String = {
    val month = idCard.substring(10,12).toInt
    val day = idCard.substring(12,14).toInt

    if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) "水瓶座"
    else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) "双鱼座"
    else if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) "白羊座"
    else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) "金牛座"
    else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) "双子座"
    else if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) "巨蟹座"
    else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) "狮子座"
    else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) "处女座"
    else if ((month == 9 && day >= 23) || (month == 10 && day <= 22)) "天秤座"
    else if ((month == 10 && day >= 23) || (month == 11 && day <= 21)) "天蝎座"
    else if ((month == 11 && day >= 22) || (month == 12 && day <= 21)) "射手座"
    else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) "摩羯座"
    else "未知"
  }
  def getZodiactrait(zodiac:String): String = {
    val map = Map(
    "水瓶座" -> "思维独特、追求自由、创新反叛、待人友善但保持独立,富有人道主义精神"
    ,
    "双鱼座" -> "感性细腻、富有幻想、善良温柔、共情能力强,易受情绪影响但充满艺术天赋"
    ,
    "白羊座" -> "热情冲动、勇敢自信、争强好胜、行动力强,做事果断但有时缺乏耐心"
    ,
    "金牛座" -> "稳重务实、坚韧执着、追求安全感,热爱美食与美好事物,略显固执但可靠"
    ,
    "双子座" -> "机智灵活、善于沟通、好奇心强、适应力佳,思维跳跃但易缺乏专注力"
    ,
    "巨蟹座" -> "温柔顾家、敏感细腻、重感情、有保护欲,情绪波动大但极具责任感"
    ,
    "狮子座" -> "自信霸气、慷慨热情、爱面子、有领导力,阳光开朗但偶尔有些自负"
    ,
    "处女座" -> "细致严谨、追求完美、勤奋务实、逻辑清晰,有洁癖且挑剔但责任心极强"
    ,
    "天秤座" -> "优雅随和、追求公平、善于社交、审美出众,犹豫不决但极具协调能力"
    ,
    "天蝎座" -> "神秘腹黑、洞察力强、爱恨分明、意志力坚定,占有欲强但重情重义"
    ,
    "射手座" -> "乐观开朗、热爱自由、喜欢冒险、心胸开阔,做事随性但缺乏耐心"
    ,
    "摩羯座" -> "沉稳内敛、野心十足、脚踏实地、坚韧不拔,略显刻板但极具责任心"
    ,
    "未知" -> "暂无对应性格特点(身份证信息异常)")
    map.getOrElse(zodiac,"未知")
  }
  def main(args: Array[String]): Unit = {
    val idCard = "320324200603034419"
    val gender = "女"
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac= getZodiac(idCard)
    val zodiacTrait= getZodiactrait(zodiac)

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

}

image.png