用Scala探索身份证号码的秘密

个别小知识点:

1. toInt 把字符串转换成整数
2. toUpperCase 变大写
3. toLowerCase 变小写
4. substring(起点,终点-不包括) 字符串截取
5. charAt(下标) 得到对应位置的字符(不是字符串)
6. asDigit 把字符转换成数字
7. """ 三引号字符串,支持换行
8. contains 是否包含子串

揭秘时刻:

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

    println("abc".length)

    //    val score = 89
    val id = "42032220080903332X"
    println(s"身份证号是:${id}")
    // 1. 生日是?
    // 字符串截取
    val birthday = id.substring(10, 14) // 不包括中终点下标
    println(s"生日是:${birthday}")

    val year = id.substring(6, 10) // 6,7,8,9 这个下标
    println(s"年份是:${year}") // 2008

    // 性别:倒数第二位
    // 如果是奇数:boy,偶数:girl
    //    val gender = id(16)
    val gender = id.charAt(16)
    println(gender)
    if (gender.toInt % 2 == 0) {
      println("性别是:女孩")
    }
    else {
      println("性别是:男孩")
    }

    // 前两位表示省份
    val province = id.substring(0, 2).toInt
    val m1 = Map((41, "河南"), (42, "湖北"), (43, "湖南"), (44, "广东"))
    println(s"籍贯是:${m1.get(province)}")

    // 验证身份证号是否合法?
    // 每一位的权重
    val weights = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
    val checkCodes = "10X98765432"
    //    id(0).toInt * weights(0) + id(1).toInt * weights(1) + id(2).toInt * weights(2)
    var sum = 0
    // 对身份证的前17位,与对应的权重相乘累加
    for (i <- 0 to 16) {
      sum += id(i).asDigit * weights(i)
    }
    // 把累加的结果模11,找到对应的校验码
    if (id.charAt(17) == checkCodes.charAt(sum % 11)) {
      println(s"身份证号${id}是合法的")
    } else {
      println(s"身份证号${id}是不合法的")
    }


    //    println("abACB".toLowerCase)

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


  }
}

你可能感兴趣的:(scala)