String 的定义
String 在 Scala 中是不可变的字符序列,这意味着一旦创建,其内容就不能被修改。
定义格式:
- 双引号: val str = "xxxx"
- 三引号。支持换行。
/*
字符串:
格式1:双引号
格式2:三引号。支持换行
*/
object day41 {
def main(args: Array[String]): Unit = {
val str1="静夜思 李白 24143554545554"
val str2=
"""静夜思
李白
"""
println(str1)
println(str2)
}
}
String 的常用方法
1.索引访问
可以使用索引来访问字符串中的字符,索引从 0 开始
val str1="hello scala"
//字符串(下标),下标从0开始
println(str1(0))// 输出:h
2.长度获取
使用length方法获取字符串长度
val str = "Scala is great"
println("字符串的长度是"+str.length) // 输出:字符串的长度是14
3.子串提取
格式: subString(起点,终点-不包括)
val str = "42900520112130042"
println(str.substring(7)) // 获取身份证号中的生日
println(str.substring(0, 5)) // 根据身份证号中的倒数第二位,来判断学生的性别
4.字符串转成数字
val str = "429005200112130042"
val gender = str.substring(16,17) // 根据身份证号中的倒数第二位,来判断性别
if(gender.toInt % 2==1) { println("性别为男")}
charAt() 得到的是字符,如果对字符使用toInt,就会得到对于的ASCII码。
asDigit。正确的使用方式是用asDiget
案例实现:输入身份证号输出基本信息
编写程序,实现效果。 // 从键盘上输入一个身份证号,输出判断结果
- 籍贯:湖北省
- 性别:男
- 年龄:40
- 生日:06-11
- 星座:巨蟹
- 性格:。。。。
package string
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit
/*
* 任务: 从键盘输入一个身份证号。
* 写程序,提取信息
* 1.性别
**/
object string03 {
// 身份证前两位地区映射
val regionMap: 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" -> "澳门特别行政区"
)
// 星座日期范围定义
private val zodiacRanges = List(
((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), "摩羯座"),
((1, 20), (2, 18), "水瓶座"),
((2, 19), (3, 20), "双鱼座")
)
// 函数
def getZodiacPersonality(zodiac: String): String = {
zodiac match {
case "白羊座" => "热情勇敢、行动力强、冲动直接、领导力强"
case "金牛座" => "稳重务实、有耐心、固执保守、追求稳定"
case "双子座" => "聪明机智、好奇心强、善变灵活、沟通能力好"
case "巨蟹座" => "情感细腻、家庭观念强、敏感多疑、保护欲强"
case "狮子座" => "自信大方、有领导力、爱面子、慷慨热情"
case "处女座" => "细心谨慎、追求完美、分析力强、有些挑剔"
case "天秤座" => "优雅和谐、公正平衡、犹豫不决、社交能力强"
case "天蝎座" => "深沉神秘、直觉敏锐、占有欲强、意志坚定"
case "射手座" => "乐观开朗、热爱自由、冒险精神、直率坦诚"
case "摩羯座" => "务实稳重、责任感强、目标明确、有些保守"
case "水瓶座" => "独立思考、创新思维、友善博爱、略显叛逆"
case "双鱼座" => "温柔浪漫、富有同情心、想象力丰富、敏感脆弱"
case _ => "性格特征未知"
}
}
def main(args: Array[String]): Unit = {
// println("请输入身份证号码:")
// val idCard = scala.io.StdIn.readLine().trim
val idCard = "429005198406250053"
if (validateIdCard(idCard)) {
analyzeIdCard(idCard)
} else {
println("身份证号码格式错误!")
}
}
/**
* 根据月份和日期判断星座
* @param month 月份 (1-12)
* @param day 日期 (1-31)
* @return 星座名称
*/
def getZodiac(month: Int, day: Int): String = {
require(month >= 1 && month <= 12, "月份必须在1-12之间")
require(day >= 1 && day <= 31, "日期必须在1-31之间")
// 将日期转换为统一格式进行比较
val dateValue = month * 100 + day
zodiacRanges.find { case ((startMonth, startDay), (endMonth, endDay), _) =>
val startValue = startMonth * 100 + startDay
val endValue = endMonth * 100 + endDay
if (startMonth <= endMonth) {
// 正常区间(同一年内)
dateValue >= startValue && dateValue <= endValue
} else {
// 跨年区间(摩羯座、水瓶座、双鱼座)
dateValue >= startValue || dateValue <= endValue
}
}.map(_._3).getOrElse("未知星座")
}
def validateIdCard(idCard: String): Boolean = {
idCard.matches("^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$")
}
def analyzeIdCard(idCard: String): Unit = {
// 提取地区代码
val regionCode = idCard.substring(0, 2)
val region = regionMap.getOrElse(regionCode, "未知地区")
// 提取性别(第17位,奇数为男,偶数为女)
val genderDigit = idCard.charAt(16).toString.toInt
val gender = if (genderDigit % 2 == 1) "男" else "女"
// 提取生日
val birthdayStr = idCard.substring(6, 14)
val formatter = DateTimeFormatter.ofPattern("yyyyMMdd")
val birthday = LocalDate.parse(birthdayStr, formatter)
val formattedBirthday = birthday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
// 计算年龄
val currentDate = LocalDate.now()
val age = ChronoUnit.YEARS.between(birthday, currentDate).toInt
// 提取月份
val month = idCard.substring(10, 12).toInt
// 提取日期
val day = idCard.substring(12, 14).toInt
val zodiac = getZodiac(month, day)
val personality= getZodiacPersonality(zodiac)
// 输出结果
println("身份证信息分析结果:")
println("籍贯:" + region)
println("性别:" + gender)
println("年龄:" + age + "岁")
println("生日:" + formattedBirthday)
println("星座:" + zodiac)
println("性格:" + personality)
}
}