String 的定义
String 在 Scala 中是不可变的字符序列,这意味着一旦创建,其内容就不能被修改。
字符串的两种定义格式: 1.双引号: val str = "xxxx"
2.三引号。支持换行。
基本代码:
package string
/**
* 字符串
* 1. 理论
* 两种定义格式 (1) 双引号 (2) 三引号,支持换行
* (1) 获取指定下标上的字符
*
* 2. 应用:从身份证号中,解析出基本信息
*/
object string01 {
def main(args: Array[String]): Unit = {
val str1:String="hello scala"
val str2:String="""
静夜思
李白
床前明月光,
"""
println(str2)
}
}
String 的常用方法
1.索引访问
可以使用索引来访问字符串中的字符,索引从 0 开始。
2.长度获取
使用length方法获取字符串长度。
3.子串提取
格式: subString(起点,终点-不包括)
基本代码:
package string
/**
* 字符串
* 1. 理论
* 两种定义格式 (1) 双引号 (2) 三引号,支持换行
* (1) 获取指定下标上的字符
* (2) 获取字符串的长度,length属性,空格也是字符
* (3) 获取子串,只需要一个长字符串中的一部分
* 2. 应用:从身份证号中,解析出基本信息
*/
object string02 {
def main(args: Array[String]): Unit = {
val str1:String="hello scala"
// val str2:String="""
// 静夜思
// 李白
// 床前明月光,
// """
// println(str2)
println(str1(0))
println(str1.length)
// str1.substring(起点下标,重点下标,不包含)
val str2=str1.substring(1,5)//hello
println(str2)
println(str1.substring(6,9))
}
}
应用:从身份证号中,解析出基本信息:
基本代码:
package string
import java.time.LocalDate
import java.time.Period
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit
/**
* 字符串
* 1. 理论
* 两种定义格式 (1) 双引号 (2) 三引号,支持换行
* (1) 获取指定下标上的字符
* (2) 获取字符串的长度,length属性,空格也是字符
* (3) 获取子串,只需要一个长字符串中的一部分
* 2. 应用:从身份证号中,解析出基本信息
* 示例 :429005198406220051
*
* (1) 省份:42 湖北,43 湖南,11 北京.....
* (2) 市区,乡镇 9005
* (3) 出生日期 8622
* (4) 出生年份 1984
* (5) 顺序码 00
* (6) 倒数第二位 5, 奇数表示性别: 男 偶数: 女
* (7) 最后一位,是校验码,验证这个身份证号是否真实
*/
object string04 {
def main(args: Array[String]): Unit = {
val idCard = "429005200010100026"
// 1. 验证身份证号长度(18位)
if (idCard.length != 18) {
println("身份证号长度不符合要求!")
return
}
// 2. 解析省份(前2位)
val provinceCode = idCard.substring(0, 2)
val province = provinceCode match {
case "11" => "北京市"
case "12" => "天津市"
case "13" => "河北省"
case "14" => "山西省"
case "15" => "内蒙古自治区"
case "21" => "辽宁省"
case "22" => "吉林省"
case "23" => "黑龙江省"
case "31" => "上海市"
case "32" => "江苏省"
case "33" => "浙江省"
case "34" => "安徽省"
case "35" => "福建省"
case "36" => "江西省"
case "37" => "山东省"
case "41" => "河南省"
case "42" => "湖北省"
case "43" => "湖南省"
case "44" => "广东省"
case "45" => "广西壮族自治区"
case "46" => "海南省"
case "50" => "重庆市"
case "51" => "四川省"
case "52" => "贵州省"
case "53" => "云南省"
case "54" => "西藏自治区"
case "61" => "陕西省"
case "62" => "甘肃省"
case "63" => "青海省"
case "64" => "宁夏回族自治区"
case "65" => "新疆维吾尔自治区"
case _ => "未知省份"
}
// 3. 解析出生日期(第7-14位:yyyyMMdd)
val birthStr = idCard.substring(6, 14)
val birthFormatter = DateTimeFormatter.ofPattern("yyyyMMdd")
val birthDate = LocalDate.parse(birthStr, birthFormatter)
// 格式化生日(补零,如6月显示为06)
val birthStrFormatted = birthDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
// 4. 计算年龄
val currentDate = LocalDate.now()
val age = Period.between(birthDate, currentDate).getYears
// 5. 解析性别(倒数第二位)
val genderCode = idCard.charAt(16).toString.toInt
val gender = if (genderCode % 2 == 0) "女" else "男"
// 6. 解析星座(修复Range匹配问题)
val constellation = getConstellation(birthDate.getMonthValue, birthDate.getDayOfMonth)
// 输出结果
println(s"性别:$gender")
println(s"生日:$birthStrFormatted")
println(s"籍贯:$province")
println(s"年龄:$age")
println(s"星座:$constellation")
println(s"出生年份:${birthDate.getYear}")
}
/**
* 单独的星座判断方法,避免模式匹配中直接使用Range的语法错误
* @param month 月份(1-12)
* @param day 日期(1-31)
* @return 星座名称
*/
def getConstellation(month: Int, day: Int): String = {
(month, day) match {
case (1, d) if d >= 1 && d <= 19 => "摩羯座"
case (1, d) if d >= 20 && d <= 31 => "水瓶座"
case (2, d) if d >= 1 && d <= 18 => "水瓶座"
case (2, d) if d >= 19 && d <= 29 => "双鱼座"
case (3, d) if d >= 1 && d <= 20 => "双鱼座"
case (3, d) if d >= 21 && d <= 31 => "白羊座"
case (4, d) if d >= 1 && d <= 19 => "白羊座"
case (4, d) if d >= 20 && d <= 30 => "金牛座"
case (5, d) if d >= 1 && d <= 20 => "金牛座"
case (5, d) if d >= 21 && d <= 31 => "双子座"
case (6, d) if d >= 1 && d <= 21 => "双子座"
case (6, d) if d >= 22 && d <= 30 => "巨蟹座"
case (7, d) if d >= 1 && d <= 22 => "巨蟹座"
case (7, d) if d >= 23 && d <= 31 => "狮子座"
case (8, d) if d >= 1 && d <= 22 => "狮子座"
case (8, d) if d >= 23 && d <= 31 => "处女座"
case (9, d) if d >= 1 && d <= 22 => "处女座"
case (9, d) if d >= 23 && d <= 30 => "天秤座"
case (10, d) if d >= 1 && d <= 23 => "天秤座"
case (10, d) if d >= 24 && d <= 31 => "天蝎座"
case (11, d) if d >= 1 && d <= 22 => "天蝎座"
case (11, d) if d >= 23 && d <= 30 => "射手座"
case (12, d) if d >= 1 && d <= 21 => "射手座"
case (12, d) if d >= 22 && d <= 31 => "摩羯座"
case _ => "未知星座"
}
}
}