scala中的字符串-身份证中的秘密

34 阅读7分钟

一,String的定义

String 在 Scala 中是不可变的字符序列,这意味着一旦创建,其内容就不能被修改。

定义格式:

1.双引号: val str = "xxxx"

2.三引号。支持换行。

package string
/*
*
* 字符串:
* 格式1: 双引号
* 格式2: 三引号,支持换行
 */
object string01 {
  def main(args: Array[String]): Unit = {
    val str1 = "静夜思 李白 429015655440023x"

    val str2 =
      """静夜思
        李白


        """
    println(str1)
    println(str2)
  }
}

二,String的常用方法

1,获取带个字符

2,字符串的长度,空格也是有效的字符,它也会占长度

3,字符串的截取:从当前字符串中,截取一段出来 subString(起点下标,终点下标,不包含)

4,转成数字

package string

/*
*
* 字符串:
* 常见操作
* 1,获取带个字符
* 2,字符串的长度,空格也是有效的字符,它也会占长度
* 3,字符串的截取:从当前字符串中,截取一段出来 subString(起点下标,终点下标,不包含)
* 4,转成数字
 */
object string02 {
  def main(args: Array[String]): Unit = {
    val str1 = "hello scala"
    // 字符串(下标),下标从0开始
    println(str1(0))
    println("字符串的长度是:"+ str1.length)

    // 把ello这字符取出来
    val str2 = str1.substring(1,5)
    println(str2)

    // 把cal这三个字符取出来?
   // val str3 = str1.substring(7,10)
 //   println(str3)

    val str3 = "我的手机号的第三位是31"
    //
    val str4 = str3.substring(10,12)// str5是一个字符串“4”
    println(str4 + 10)// 310

    val n = str4.toInt
    println(n + 1)
  }
}

三,身份证号的秘密

1.png

前2位是省市的信息;

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

接下来8位是生日;

倒数第2位表示性别;

最后一位是校验码;

package string

import java.time.{LocalDate, Year}
import java.time.temporal.TemporalQueries.localDate

/*
*任务:从键盘输入一个身份证号码
* 写程序,提取信息
*
* 1,性别
 */
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" -> "澳门特别行政区"
    )
    while (true) {
      val str = scala.io.StdIn.readLine("请输入你要判断的身份证号:")

      //判断是否18位
      if (str.length == 18) {
        // 取出倒数第二位
        val gender = str.substring(16, 17).toInt
        println(gender)
        //性别
        val genderNum = str.charAt(16).asDigit
        // 取出奇偶数
        if (genderNum % 2 == 1) {
          // 输出
          println("这是一个帅哥")
        } else {
          println("这是一个小姑娘")
        }

        val birth = str.substring(6, 10).toInt
        println(birth)
        // 用今年
        val age = Year.now().getValue() - birth
        println(s"年龄为${age}岁")
        //判断省份
        val provinceCode = str.substring(0,2)//从身份证中获取省份
        val province = provinceCodeMap.getOrElse(provinceCode, s"未知省份(编码:$provinceCode)")
        println(s"所属省份:$province")

      }
      else
      {
        println(s"${str}不是一个合法的身份证号,长度不对")
      }


    }
      }
    }

1,

5.png

package array

import java.time.format.DateTimeFormatter
import java.time.{LocalDate, Year}

object String05 {
  def main(args: Array[String]): Unit = {
    // 1. 省份编码映射表(完整省级行政区)
    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" -> "重庆市", "51" -> "四川省", "52" -> "贵州省",
      "53" -> "云南省", "54" -> "西藏自治区", "61" -> "陕西省", "62" -> "甘肃省",
      "63" -> "青海省", "64" -> "宁夏回族自治区", "65" -> "新疆维吾尔自治区",
      "71" -> "台湾省", "81" -> "香港特别行政区", "82" -> "澳门特别行政区"
    )

    // 2. 星座映射(月份+日期范围)
    val constellationMap: List[(Int, Int, Int, Int, String)] = List(
      (1, 20, 2, 18, "水瓶座"), (2, 19, 3, 20, "双鱼座"),
      (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, "摩羯座")
    )

    // 3. 星座对应的性格参考(示例)
    val constellationPersonality: Map[String, String] = Map(
      "水瓶座" -> "核心特质:独立先锋、脑洞清奇\n优点:创新力强、尊重差异、理性通透\n小缺点:忽冷忽热、过于理想化",
      "双鱼座" -> "核心特质:浪漫共情、温柔敏感\n优点:善解人意、想象力丰富、重感情\n小缺点:容易emo、偶尔逃避现实",
      "白羊座" -> "核心特质:热情敢冲、直率坦荡\n优点:行动力强、乐观自信、讲义气\n小缺点:急性子、偶尔冲动莽撞",
      "金牛座" -> "核心特质:稳重务实、慢热长情\n优点:靠谱踏实、耐心专一、生活质感强\n小缺点:有点固执、偶尔太“慢半拍”",
      "双子座" -> "核心特质:机灵多变、好奇心爆棚\n优点:口才好、适应力强、有趣会玩\n小缺点:三分钟热度、偶尔“没走心”",
      "巨蟹座" -> "核心特质:顾家念旧、温柔体贴\n优点:共情力强、细心周到、重情义\n小缺点:容易敏感内耗、有点恋旧执拗",
      "狮子座" -> "核心特质:自信耀眼、慷慨大气\n优点:领导力强、乐观开朗、真诚仗义\n小缺点:好面子、偶尔有点小傲娇",
      "处女座" -> "核心特质:细致严谨、追求极致\n优点:责任心强、逻辑清晰、靠谱周到\n小缺点:有点完美主义、偶尔太较真",
      "天秤座" -> "核心特质:优雅平衡、社交达人\n优点:情商高、公正温和、审美在线\n小缺点:选择困难、偶尔有点“老好人”",
      "天蝎座" -> "核心特质:神秘敏锐、执着坚定\n优点:洞察力强、专一长情、有韧性\n小缺点:有点记仇、偶尔太较真",
      "射手座" -> "核心特质:自由乐观、热爱冒险\n优点:心胸开阔、幽默风趣、行动力强\n小缺点:有点散漫、偶尔“没心没肺”",
      "摩羯座" -> "核心特质:沉稳务实、目标感强\n优点:踏实肯干、责任心强、抗压能力棒\n小缺点:有点闷、偶尔太“卷”自己"
    )

    // 循环读取身份证号
    while (true) {
      val idCard = scala.io.StdIn.readLine("请输入18位身份证号:").trim

      // 验证长度
      if (idCard.length != 18) {
        println("请输入合法的18位身份证号!")
        println("------------------------")
      }

      try {
        // 提取省份(前2位)
        val provinceCode = idCard.substring(0, 2)
        val province = provinceCodeMap.getOrElse(provinceCode, "未知省份")

        // 提取性别(第17位,奇数男/偶数女)
        val genderCode = idCard.charAt(16).asDigit
        val gender = if (genderCode % 2 == 1) "男" else "女"

        // 提取生日(第7-14位:yyyyMMdd)
        val birthStr = idCard.substring(6, 14)
        val birthDate = LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd"))
        val birthFormat = birthDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

        // 计算年龄
        val currentYear = Year.now().getValue
        val birthYear = birthDate.getYear
        val age = currentYear - birthYear

        // 计算星座
        val month = birthDate.getMonthValue
        val day = birthDate.getDayOfMonth
        val constellation = constellationMap.find {
          case (sMonth, sDay, eMonth, eDay, _) =>
            if (sMonth <= eMonth) (month == sMonth && day >= sDay) || (month == eMonth && day <= eDay)
            else (month == sMonth && day >= sDay) || (month == eMonth && day <= eDay)
        }.map(_._5).getOrElse("未知星座")

        // 获取性格参考
        val personality = constellationPersonality.getOrElse(constellation, "暂无性格参考")

        // 按要求顺序输出
        println(s"籍贯:$province")
        println(s"性别:$gender")
        println(s"年龄:${age}岁")
        println(s"生日:$birthFormat")
        println(s"星座:$constellation")
        println(s"性格:$personality(参考星座物语)")
      } catch {
        case _: Exception =>
          println("身份证号格式错误,请检查后重新输入!")
      }
      println("------------------------")
    }
  }
}