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

35 阅读3分钟

一. String 的定义

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

定义格式:

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

2.三引号。支持换行。

def main(args: Array[String]): Unit = {
  val name = "小花"

  val str = s"I like scala, $name"

  val content ="""
                静夜思
                 李白
               床前明月光,
               疑是地上霜。
               举头望明月,
               低头思故乡。
  """
  
  println(content)
}

结果如图:

image.png

二. String 的常用方法

1. 索引访问

可以使用索引来访问字符串中的字符,索引从 0 开始。

val str = "hello scala"

println(str(0))

结果如图:

image.png

2. 长度获取

使用length方法获取字符串长度。

 def main(args: Array[String]): Unit = {

    val str = "hello scala"

    println(str.length)

  }

结果如图:

image.png

3. 子串提取

使用substring方法可以提取字符串的子串。

格式:

subString(起点,终点-不包括)

val str = "hello scala"

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

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

结果如图:

image.png

4. 字符串转成数字

从身份证号中取出第17位,判断奇偶,并输出对应的结果。


   // 倒数第二个数: 奇数,男;偶数,女
  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 = "140502200401080853"

   val gender = getGender(idCard)
   
   println(s" 性别: $gender")
 
 }

结果如图:

image.png

字符转成数字

charAt() 得到的是字符,如果对字符使用toInt,就会得到对于的ASCII码。

asDigit。正确的使用方式是用asDiget。

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


import java.time.LocalDate

 object stringid03 {

   // 倒数第二个数: 奇数,男;偶数,女
  def getGender(idCard: String): String = {
    val g = idCard.substring(16, 17).toInt
    if (g % 2 == 1) {
      "男"
    } else {
      "女"
    }

  }

  def getAge(idCard: String): Int = {
    // 根据身份证中的出生日期, 计算年龄
    val year = idCard.substring(6, 10)
    // 今年的年份 - year
    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 <= 23)) "天秤座"
      else if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) "天蝎座"
      else if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) "射手座"
      else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) "摩羯座"
      else "未知"

    }


    def getProvince(idCard: String): String = {
    val code = idCard.substring(0, 2) // 11
    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" -> "新疆维吾尔自治区"
    )
    map.getOrElse(code, "未知")
  }

   def getInfo(zodiac: String): String = {
     // 描述各个星座的性格
     val map = Map(
       "白羊座"->"性格直率,充满活力,喜欢冒险和刺激,但有时冲动易怒,固执己见。",
       "金牛座"->"稳重务实,沉默寡言,注重物质享受,但有时固执己见,对钱财看得较重。",
       "双子座"->"思维敏捷,沟通能力强,适应力强,但有时过于不专心,缺乏专注。",
       "巨蟹座"->"敏感温柔,家庭观念强,富有保护欲,但有时过于情绪化,安全感低。",
       "狮子座"->"自信骄傲,有领导能力,讲义气,但有时不够稳重,渴望自大。",
       "处女座"->"细致较真,思维清晰,待人真诚,但有时过于挑剔,追求完美。",
       "天秤座"->"温和优雅,公正理智,社交出色,但有时优柔寡断,难以决定。",
       "天蝎座"->"神秘深沉,直觉敏锐,意志坚定,但有时报复心重,多疑记仇。",
       "射手座"->"开朗乐观,喜欢自由冒险,但有时粗心大意,缺乏责任感。",
       "摩羯座"->"稳重谦虚,耐心野心,但有时过于保守,缺乏热情。",
       "水瓶座"->"叛逆爱创新,富有同情心,爱幻想,但有时显得怪异,粗心大意。",
       "双鱼座"->"浪漫爱幻想,内心柔软。"
     )
     map.getOrElse(zodiac, "未知")

     }

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

    val gender = getGender(idCard)
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac = getZodiac(idCard)  // 星座
    val info = getInfo(zodiac)

    println("=============")
    println(s" 籍贯: $province")
    println(s" 性别: $gender")
    println(s" 年龄: $age")
    println(s" 生日: $birthday")
    println(s" 星座: $zodiac")
    println(s" 性格简介: $info")
    println("=============")
  }

}

结果如图:

image.png