scala中字符串的练习题

36 阅读4分钟

身份证号的基本知识

  • 举例某个同学的身份证信息,讲解

  • 前2位是省市的信息;

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

  • 接下来8位是生日;

  • 倒数第2位表示性别;

  • 最后一位是校验码;

以下为教师教学版

package string

import java.time.LocalDate

/**
 *  字符串
 *   1.理论
 *      两种定义格式 (1):双引号,(2):三引号 ,支持换行
 *      (1) 获取指定下标的字符
 *      (2) 获取字符串的长度,length属性,空格也是字符
 *      (3) 获取子串,只需要一个长字符串中的一部分
 *
 *   2.应用:从身份证号中,解析出基本信息
 *   示例:520119200602030416
 *
 *   (1) 省份:42 湖北,43 湖南,11 北京 ......
 *   (2) 市区,乡镇, 0119
 *   (3) 出生年份 2006
 *   (4) 出生日期 0203
 *   (5) 顺序码 11
 *   (6) 倒数第二位 1,奇数表示性别:男  偶数:女
 *   (7) 最后一位,是校验码,验证这个身份证号是不是正确的!!!
 *
 */
object string04 {
  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)
    //
    val provinceMap = 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" -> "澳门特别行政区"
    )
    provinceMap.getOrElse(procode,"未知")
  }


  def main(args: Array[String]): Unit = {
    val idCard = "520423200602030119"
    val gender = getGender(idCard)
    val birthday = getBirthdaY(idCard)

    val age = getAge(idCard)
    val province = getProvince(idCard)
    println(s"""
    性别:${gender}
    生日:${birthday}
    籍贯:${province}
    年龄:${age}
    星座:xx星座
    """)
  }
}

以下为AI代写版代码,仅供参考

package string

/**
 *  字符串
 *   2.应用:从身份证号中,解析出基本信息
 *   示例:520119200602030416
 *
 *   (1) 省份:42 湖北,43 湖南,11 北京 ......
 *   (2) 市区,乡镇, 0119
 *   (3) 出生年份 2006
 *   (4) 出生日期 0203
 *   (5) 顺序码 11
 *   (6) 倒数第二位 1,奇数表示性别:男  偶数:女
 *   (7) 最后一位,是校验码,验证这个身份证号是不是正确的!!!
 *
 */
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter

object string03 {
  def main(args: Array[String]): Unit = {
    // 目标身份证号码
    val idCard = "520423200602030119"

    // 1. 身份证合法性校验
    if (!validateIdCard(idCard)) {
      println("身份证号码格式不合法!")
      return
    }

    // 2. 解析各项信息
    val (birthday, gender, nativePlace, age, constellation) = parseIdCardInfo(idCard)

    // 3. 按指定格式输出
    println(s"性别:$gender")
    println(s"生日:$birthday")
    println(s"籍贯:$nativePlace")
    println(s"年龄:$age")
    println(s"星座:$constellation")
  }

  /**
   * 校验身份证合法性(18位长度 + 生日格式有效)
   */
  private def validateIdCard(idCard: String): Boolean = {
    if (idCard.length != 18) false
    else {
      try {
        val birthStr = idCard.substring(6, 14)
        LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd"))
        true
      } catch {
        case _: Exception => false
      }
    }
  }

  /**
   * 解析身份证核心信息
   * @return (生日字符串, 性别, 籍贯, 年龄, 星座)
   */
  private def parseIdCardInfo(idCard: String): (String, String, String, Int, String) = {
    // 解析生日
    val birthStr = idCard.substring(6, 14)
    val birthday = LocalDate.parse(birthStr, DateTimeFormatter.ofPattern("yyyyMMdd"))
    val birthdayStr = birthday.format(DateTimeFormatter.ISO_LOCAL_DATE)

    // 解析性别(第17位:奇数男,偶数女)
    val genderCode = idCard.charAt(16).toString.toInt
    val gender = if (genderCode % 2 == 1) "男" else "女"

    // 解析籍贯(前6位行政区划码,精准匹配520423)
    val areaCode = idCard.substring(0, 6)
    val areaMap = Map(
      "520000" -> "贵州省",
      "520400" -> "贵州省安顺市",
      "520423" -> "贵州省安顺市镇宁县" // 精准匹配目标身份证的行政区划码
    )
    val nativePlace = areaMap.getOrElse(areaCode, s"未知(区划码:$areaCode)")

    // 计算年龄(按当前日期计算周岁)
    val now = LocalDate.now()
    val age = Period.between(birthday, now).getYears

    // 计算星座
    val constellation = getConstellation(birthday)

    (birthdayStr, gender, nativePlace, age, constellation)
  }

  /**
   * 根据生日计算星座
   */
  private def getConstellation(birthday: LocalDate): String = {
    val month = birthday.getMonthValue
    val day = birthday.getDayOfMonth

    (month, day) match {
      case (1, 20) | (2, _) if day < 19 => "水瓶座"
      case (2, 19) | (3, _) if day < 21 => "双鱼座"
      case (3, 21) | (4, _) if day < 20 => "白羊座"
      case (4, 20) | (5, _) if day < 21 => "金牛座"
      case (5, 21) | (6, _) if day < 22 => "双子座"
      case (6, 22) | (7, _) if day < 23 => "巨蟹座"
      case (7, 23) | (8, _) if day < 23 => "狮子座"
      case (8, 23) | (9, _) if day < 23 => "处女座"
      case (9, 23) | (10, _) if day < 24 => "天秤座"
      case (10, 24) | (11, _) if day < 23 => "天蝎座"
      case (11, 23) | (12, _) if day < 22 => "射手座"
      case _ => "摩羯座" // 12.22-1.19
    }
  }
}

//
// 性别:男
// 生日:2006-02-03
// 籍贯:贵州省安顺市镇宁县
// 年龄:19
// 星座:水瓶座