(三十一)scala中的字符串-身份证中的秘密

38 阅读1分钟

😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

(一)String 的定义😎

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

定义格式

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

2.三引号。支持换行。

package stringid
/*
* string 类型,字符串
* 定义字符串:
* 1. 双引号
* 2. 三引号
*/
object stringid01 {
  def main(args: Array[String]): Unit = {
    val name = "小花"

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

    val content =
      """静夜思
        |床前明月光,
        |疑是地上霜。
        |举头望明月,
        |低头思故乡。
      """

    println(content)
  }
}😍

(二)String 的常用方法😝

1.索引访问

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

2. 长度获取

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

3. 子串提取

package stringid

  /*
  * String 类型,字符串
  * 常用的方法:
  * 1. 长度: length属性
  * 2. 下标: 从0开始,表示每一个字符
  * 3. 截取: 在一个长的字符串中,取出一部分。
  */
  object stringid02 {
    def main(args: Array[String]): Unit = {
      val str = "hello scala"

      // 输出字符串长度
      println(str.length)

      // 输出下标为0的字符
      println(str(0))

      // 2. 取出"llo"这三个字符(从下标2开始,到下标5结束,左闭右开)
      println(str.substring(2, 5))

      // 取出"cal"这三个字符(从下标7开始,到下标10结束,左闭右开)
      println(str.substring(7, 10))
    }
}

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

4.字符串转成数字

代码如下

package stringid

import java.time.LocalDate


object stringid05 {
  // 根据第二个数: 奇数: 男;偶数: 女
  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) // 11->"河北"
    val map = Map(
      "11"->"北京", "12"->"天津", "13"->"河北", "14"->"山西", "15"->"内蒙古",
      "21"->"辽宁", "22"->"吉林", "23"->"黑龙江", "31"->"上海", "32"->"江苏",
      "33"->"浙江", "34"->"安徽", "35"->"福建", "36"->"江西", "37"->"山东",
      "41"->"河南","42"->"湖北"
    )
    map.getOrElse(code, "未知")
  }

  def getBirthday(idCard: String):String = {
    val month = idCard.substring(10,12)
    val day = idCard.substring(12,14)
    s"$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 "摩羯座"
  }

  def getAge(idCard: String): Int = {
    // 1. 获得身份证的出生年份
    val birthYear = idCard.substring(6,10)
    // 2. 获得当前的年份
    LocalDate.now().getYear - birthYear.toInt
  }

  def main(args: Array[String]): Unit = {
    val idCard = "149005200410100083"
    val gender = getGender(idCard)
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac = getZodiac(idCard) // 星座

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

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