验证身份证号码是否正确(带校验算法)
题目内容:
输入一个字符串,请判断是否满足身份证基本要求,并返回具体的生日yyyy-mm-dd。
如果输入数据有误,请输出0000-00-00。
基本要求是:1.必须是18位;2. 前面位数必须是数字,最后一位可以是数字或小写字母;3. 日期是存在的;4.最后一位校验码检查。
校验码规则如下:
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和各个系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。
5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是10,身份证的最后一位号码就是罗马数字x。
Java代码: `package A6_SmartCampus_ComprehensiveServiceLearningAndEngineeringPlatform.Function.StudentInformationManagement.Predicted.Registered;
import A6_SmartCampus_ComprehensiveServiceLearningAndEngineeringPlatform.Function.StudentInformationManagement.Predicted.CaLendar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class JudgingIDCard {
static final int ERROR_NUM = -1;
static final int CORRECT_NUM = 1;
public static void main(String[] args)
{
String id;
int checkResult = 0;
//创建一个IDChecker类
IDChecker2 idc = new IDChecker2();
do {
//调用输入身份证号的方法
id = idc.enterID();
//验证身份证号是否真确
checkResult = idc.checkID(id);
switch (checkResult) {
case ERROR_NUM:
System.out.println("请重新输入!");
break;
case CORRECT_NUM:
System.out.println("身份证号符合当前所有校验规则!");
System.out.println("出生日期:"+id.substring(6, 10)+ "-" +id.substring(10, 12)+ "-" +id.substring(12, 14));
System.out.println("性别为;" + idc.gender(id.charAt(16)));
System.out.println("年龄为(实岁):" + idc.age(id.substring(6, 10), id.substring(10, 12), id.substring(12, 14)));
idc.area(id.substring(0, 2), id.substring(2, 4));
break;
default:
break;
}
}
while (checkResult != 1);
}
}
class IDChecker2 implements CaLendar {
final int ERROR_NUM = -1;
final int CORRECT_NUM = 1;
private String id;
private final String DRIVER = "com.mysql.cj.jdbc.Driver";
private final String URL = "jdbc:mysql://localhost:3306/“数据库表名”?characterEncoding=utf-8";
private final String USERNAME = "root";
private final String PASSWORD = "123456";
//无参构造方法
public IDChecker2() {
}
//全参构造方法
public IDChecker2(String id) {
this.id = id;
}
//输入身份证号的方法
public String enterID() {
System.out.println("请输入身份证号:");
BufferedReader input = null;
input = new BufferedReader(new InputStreamReader(System.in));
try {
id = input.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return id;
}
public int checkID(String id) {
//1.必须是18位
int lc = lengthCheck(id);
if (lc < 0) return lc;
//2.前面17位数必须是数字,最后一位可以是数字或小写字母x;
int dic = digitCheck(id);
if (dic < 0) return dic;
//3.日期是存在的。
int dac = dateCheck(id);
if (dac <0) return dac;
//4.最后一位校验码检查。
int ldc = lastDigitCheck(id);
if (ldc < 0) return ldc;
//所有校验通过后,返回1
return CORRECT_NUM;
}
public int lengthCheck(String id) {
//1.必须是18位
if (id.length() != 18) {
System.out.println("输入错误:位数不是18位!");
return ERROR_NUM;
}
return 0;
}
public int digitCheck(String id) {
//2.前面位数必须是数字,最后一位可以是数字或小写字母x;
int i, n = 0;
for( i = 0; i < 17; i++)
{
if(id.charAt(i) >= '0' && id.charAt(i) <= '9')
{
n++;
}
else
break;
}
if(n <= 16 || !((id.charAt(17) >= '0'&& id.charAt(17) <= '9') || id.charAt(17) == 'x' )) {
System.out.println("输入错误:前面位数必须是数字,最后一位可以是数字或小写字母'x'!");
return ERROR_NUM;
}
return 0;
}
public int dateCheck(String id) {
//3.日期是存在的。
int year, month, day;
//把输入的身份证的日期分给year month day
year = Integer.valueOf(id.substring(6, 10));
month = Integer.valueOf(id.substring(10, 12));
day = Integer.valueOf(id.substring(12, 14));
//当前年份
SimpleDateFormat yearY = new SimpleDateFormat("yyyy");
Date date = new Date();
int year01 = Integer.valueOf(yearY.format(date));
//判断年份
boolean flag = false;
//判断获取年份是否大于当前年份,大于则输出错误,小于则继续判断月份
if (year01 < year) {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
//判断月份是否在范围之内
else if (month <= 12 && month > 0) {
//如果月份在范围之内,则余2判断是大月还是小月,偶数月不包含2月,后面单独判断
if (month % 2 == 0 && month != 2) {
//如果是偶数月,则day要大于0且小等于30
if (day > 0 && day <= 30) {
flag = true;
}
else {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
}
//判断是否是奇数月
else if (month % 2 == 1) {
//如果是奇数月,则day要大于0且小等于31
if (day > 0 && day <= 31) {
flag = true;
}
else {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
}
//判断month是否等于2,若等于,则判断是否是闰年,是闰年,则2月有29天,day的范围要大于0且小等于29
else if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
if (day > 0 && day <= 29) {
flag = true;
}
else {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
}
//如果不是闰年则2月有28天,day的范围要大于0且小等于28
else if (month == 2 && !(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
if (day > 0 && day <= 28) {
flag = true;
}
else {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
}
}
if (flag) {
String strDate = id.substring(6, 14);
// 准备第一个模板,从字符串中提取出日期数字
String pat1 = "yyyyMMdd" ;
// 实例化模板对象
SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;
Date d = null ;
// 将给定的字符串中的日期提取出来
// 如果提供的字符串格式有错误,则进行异常处理
// 打印异常信息
try{
d = sdf1.parse(strDate) ;
}catch(Exception e){
e.printStackTrace() ;
}
String r = sdf1.format(d);
if(!r.equals(strDate)) {
System.out.println("输入日期错误!");
return ERROR_NUM;
}
}
return 0;
}
public int lastDigitCheck(String id) {
//4.最后一位校验码检查。
/*
- 校验码规则如下:
- 1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
- 2、将这17位数字和系数相乘的结果相加。
- 3、用加出来和除以11,看余数是多少?
- 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。
- 5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是10,身份证的最后一位号码就是罗马数字x。
*/
//1.系数数组定义
int[] factors = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//2.求和
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (id.charAt(i) - '0') * factors[i];
}
//3.取余
int remainder = sum % 11;
//4.余数映射数组定义
char[] mappedDigits = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
//5.生成最后一位(校验位)
char lastDigit = mappedDigits[remainder];
// System.out.println("校验位:"+lastDigit);
//判断输入的最后一位是否符合校验规则
if (id.charAt(17) != lastDigit) {
System.out.println("输入错误:最后一位不符合校验规则");
return ERROR_NUM;
}
return 0;
}
//判断性别
public String gender(char g) {
for (int i = 0; i < 10; i += 2) {
if ((g - 48) == i) {
return "女性";
}
}
return "男性";
}
//计算年龄
public int age(String year, String month, String day) {
int age = 0;
int age01 = 0;
//获取今年年份 给year01
SimpleDateFormat year01 = new SimpleDateFormat("yyyy");
Date date = new Date();
//把year01赋给yearAge,用于获取字符串长度
String yearAge = year01.format(date);
//创建数组,然后遍历字符串,把得到的每个字符转换成整数
//可以使用Integer.valueOf方法
int[] arr = new int[4];
//遍历字符串,并且把每一位转换成int型整数放进arr数组中,把值变成四位数赋给age
for (int i = 0; i < yearAge.length(); i++) {
arr[i] = yearAge.charAt(i) - 48;
//例如2023
//把值赋给age,循环一次 * 10,第一次是 0 * 10 + 2 = 2,第二次是 2 * 10 + 0 = 20,以此类推
age = age * 10 + arr[i];
}
//把出生年份转换成int型整数
for (int i = 0; i < year.length(); i++) {
//和把今年年份转换成int型整数一样
age01 = age01 * 10 + (year.charAt(i) - 48);
}
//今年年份 - 出生年份,得到年龄,但是这个年龄不是最后的值,最后的值得要继续判断月份和日期
age -= age01;
//获取当前月份,新建一个CaLendar接口,因为Calendar创建会有很多方法重写,写在本程序中不美观,所有新建接口,创建c对象来满足需求
int month01 = CaLendar.c.get(Calendar.MONTH) + 1;
//获取当前日期
int day01 = CaLendar.c.get(Calendar.DATE);
//toInt方法把字符串转换成int型整数,把day和month转换成整数
int dayInt = toInt(day);
int monthInt = toInt(month);
//判断:
//月份是否相同,相同判断日期,如果出生日期小于当前日期,则age -= 1,获取实岁,若大于则直接return age;如果月份不相同,出生月份大于当前月份,则age -= 1
// 若小于当前月份,直接return age;
if (monthInt == month01) {
if (day01 > dayInt) {
age -= 1;
}
else if (day01 >= dayInt) {
return age;
}
}
else if (monthInt > month01) {
age -= 1;
}
else {
return age;
}
return age;
}
public int toInt(String day){
int[] arr = new int[4];
int age = 0;
for (int i = 0; i < day.length(); i++) {
arr[i] = day.charAt(i) - 48;
age = age * 10 + arr[i];
}
return age;
}
public String area(String province, String city) {
Statement stat = null;
Connection con = null;
ResultSet rs = null;
String area = "";
String sAreaCode = province + city;
int areaCode = Integer.valueOf(sAreaCode);
//System.out.println(areaCode);
try {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e1) {
e1.printStackTrace();
}
if (con != null) {
System.out.println("连接成功!");
}
try {
stat = con.createStatement();
String sql = "select * from areas where code=";
rs = stat.executeQuery(sql + areaCode);
///获取键名
ResultSetMetaData metaData = rs.getMetaData();
//获取键值
int columnCount = metaData.getColumnCount();
System.out.println(metaData);
System.out.println(columnCount);
System.out.println(rs.next());/
while (rs.next()) {
System.out.print("地区为(xx省xx市):");
System.out.print(rs.getString(2) + "省");
System.out.println(rs.getString(3) + "市");
area += rs.getString(2);
area += "省";
area += rs.getString(3);
area += "市";
}
} catch (SQLException e2) {
e2.printStackTrace();
} finally {
try {
con.close();
System.out.println("关闭成功!");
} catch (SQLException e3) {
e3.printStackTrace();
}
}
return area;
}
}`
mysql创建表并且insert数据: `create database 数据库名;
use 数据库名;
create table if not exists 数据库名.表名 ( code int ( 4 ) unique, province varchar ( 20 ), city varchar ( 20 ) unique );
导入数据
insert into areas( code, province, city ) values ( 1101, '北京', '北京' ), ( 1201, '天津', '天津' ), ( 1301, '河北', '石家庄' ), ( 1302, '河北', '唐山' ), ( 1303, '河北', '秦皇岛' ), ( 1304, '河北', '邯郸' ), ( 1305, '河北', '邢台' ), ( 1306, '河北', '保定' ), ( 1307, '河北', '张家口' ), ( 1308, '河北', '承德' ), ( 1309, '河北', '沧州' ), ( 1310, '河北', '廊坊' ), ( 1311, '河北', '衡水' ), ( 1401, '山西', '太原' ), ( 1402, '山西', '大同' ), ( 1403, '山西', '阳泉' ), ( 1404, '山西', '长治' ), ( 1405, '山西', '晋城' ), ( 1406, '山西', '朔州' ), ( 1407, '山西', '晋中' ), ( 1408, '山西', '运城' ), ( 1409, '山西', '忻州' ), ( 1410, '山西', '临汾' ), ( 1411, '山西', '吕梁' ), ( 1501, '内蒙古', '呼和浩特' ), ( 1502, '内蒙古', '包头' ), ( 1503, '内蒙古', '乌海' ), ( 1504, '内蒙古', '赤峰' ), ( 1505, '内蒙古', '通辽' ), ( 1506, '内蒙古', '鄂尔多斯' ), ( 1507, '内蒙古', '呼伦贝尔' ), ( 1508, '内蒙古', '巴彦淖尔' ), ( 1509, '内蒙古', '乌兰察布' ), ( 1522, '内蒙古', '兴安盟' ), ( 1525, '内蒙古', '锡林郭勒盟' ), ( 1529, '内蒙古', '阿拉善盟' ), ( 2101, '辽宁', '沈阳' ), ( 2102, '辽宁', '大连' ), ( 2103, '辽宁', '鞍山' ), ( 2104, '辽宁', '抚顺' ), ( 2105, '辽宁', '本溪' ), ( 2106, '辽宁', '丹东' ), ( 2107, '辽宁', '锦州' ), ( 2108, '辽宁', '营口' ), ( 2109, '辽宁', '阜新' ), ( 2110, '辽宁', '辽阳' ), ( 2111, '辽宁', '盘锦' ), ( 2112, '辽宁', '铁岭' ), ( 2113, '辽宁', '朝阳' ), ( 2114, '辽宁', '葫芦岛' ), ( 2201, '吉林', '长春' ), ( 2202, '吉林', '吉林' ), ( 2203, '吉林', '四平' ), ( 2204, '吉林', '辽源' ), ( 2205, '吉林', '通化' ), ( 2206, '吉林', '白山' ), ( 2207, '吉林', '松原' ), ( 2208, '吉林', '白城' ), ( 2224, '吉林', '延边朝鲜族自治州' ), ( 2301, '黑龙江', '哈尔滨' ), ( 2302, '黑龙江', '齐齐哈尔' ), ( 2303, '黑龙江', '鸡西' ), ( 2304, '黑龙江', '鹤岗' ), ( 2305, '黑龙江', '双鸭山' ), ( 2306, '黑龙江', '大庆' ), ( 2307, '黑龙江', '伊春' ), ( 2308, '黑龙江', '佳木斯' ), ( 2309, '黑龙江', '七台河' ), ( 2310, '黑龙江', '牡丹江' ), ( 2311, '黑龙江', '黑河' ), ( 2312, '黑龙江', '绥化' ), ( 2327, '黑龙江', '大兴安岭地区' ), ( 3101, '上海', '上海' ), ( 3201, '江苏', '南京' ), ( 3202, '江苏', '无锡' ), ( 3203, '江苏', '徐州' ), ( 3204, '江苏', '常州' ), ( 3205, '江苏', '苏州' ), ( 3206, '江苏', '南通' ), ( 3207, '江苏', '连云港' ), ( 3208, '江苏', '淮安' ), ( 3209, '江苏', '盐城' ), ( 3210, '江苏', '扬州' ), ( 3211, '江苏', '镇江' ), ( 3212, '江苏', '泰州' ), ( 3213, '江苏', '宿迁' ), ( 3301, '浙江', '杭州' ), ( 3302, '浙江', '宁波' ), ( 3303, '浙江', '温州' ), ( 3304, '浙江', '嘉兴' ), ( 3305, '浙江', '湖州' ), ( 3306, '浙江', '绍兴' ), ( 3307, '浙江', '金华' ), ( 3308, '浙江', '衢州' ), ( 3309, '浙江', '舟山' ), ( 3310, '浙江', '台州' ), ( 3311, '浙江', '丽水' ), ( 3401, '安徽', '合肥' ), ( 3402, '安徽', '芜湖' ), ( 3403, '安徽', '蚌埠' ), ( 3404, '安徽', '淮南' ), ( 3405, '安徽', '马鞍山' ), ( 3406, '安徽', '淮北' ), ( 3407, '安徽', '铜陵' ), ( 3408, '安徽', '安庆' ), ( 3410, '安徽', '黄山' ), ( 3411, '安徽', '滁州' ), ( 3412, '安徽', '阜阳' ), ( 3413, '安徽', '宿州' ), ( 3415, '安徽', '六安' ), ( 3416, '安徽', '亳州' ), ( 3417, '安徽', '池州' ), ( 3418, '安徽', '宣城' ), ( 3501, '福建', '福州' ), ( 3502, '福建', '厦门' ), ( 3503, '福建', '莆田' ), ( 3504, '福建', '三明' ), ( 3505, '福建', '泉州' ), ( 3506, '福建', '漳州' ), ( 3507, '福建', '南平' ), ( 3508, '福建', '龙岩' ), ( 3509, '福建', '宁德' ), ( 3601, '江西', '南昌' ), ( 3602, '江西', '景德镇' ), ( 3603, '江西', '萍乡' ), ( 3604, '江西', '九江' ), ( 3605, '江西', '新余' ), ( 3606, '江西', '鹰潭' ), ( 3607, '江西', '赣州' ), ( 3608, '江西', '吉安' ), ( 3609, '江西', '宜春' ), ( 3610, '江西', '抚州' ), ( 3611, '江西', '上饶' ), ( 3701, '山东', '济南' ), ( 3702, '山东', '青岛' ), ( 3703, '山东', '淄博' ), ( 3704, '山东', '枣庄' ), ( 3705, '山东', '东营' ), ( 3706, '山东', '烟台' ), ( 3707, '山东', '潍坊' ), ( 3708, '山东', '济宁' ), ( 3709, '山东', '泰安' ), ( 3710, '山东', '威海' ), ( 3711, '山东', '日照' ), ( 3712, '山东', '莱芜' ), ( 3713, '山东', '临沂' ), ( 3714, '山东', '德州' ), ( 3715, '山东', '聊城' ), ( 3716, '山东', '滨州' ), ( 3717, '山东', '菏泽' ), ( 4101, '河南', '郑州' ), ( 4102, '河南', '开封' ), ( 4103, '河南', '洛阳' ), ( 4104, '河南', '平顶山' ), ( 4105, '河南', '安阳' ), ( 4106, '河南', '鹤壁' ), ( 4107, '河南', '新乡' ), ( 4108, '河南', '焦作' ), ( 4109, '河南', '濮阳' ), ( 4110, '河南', '许昌' ), ( 4111, '河南', '漯河' ), ( 4112, '河南', '三门峡' ), ( 4113, '河南', '南阳' ), ( 4114, '河南', '商丘' ), ( 4115, '河南', '信阳' ), ( 4116, '河南', '周口' ), ( 4117, '河南', '驻马店' ), ( 4201, '湖北', '武汉' ), ( 4202, '湖北', '黄石' ), ( 4203, '湖北', '十堰' ), ( 4205, '湖北', '宜昌' ), ( 4206, '湖北', '襄阳' ), ( 4207, '湖北', '鄂州' ), ( 4208, '湖北', '荆门' ), ( 4209, '湖北', '孝感' ), ( 4210, '湖北', '荆州' ), ( 4211, '湖北', '黄冈' ), ( 4212, '湖北', '咸宁' ), ( 4213, '湖北', '随州' ), ( 4228, '湖北', '恩施土家族苗族自治州' ), ( 4301, '湖南', '长沙' ), ( 4302, '湖南', '株洲' ), ( 4303, '湖南', '湘潭' ), ( 4304, '湖南', '衡阳' ), ( 4305, '湖南', '邵阳' ), ( 4306, '湖南', '岳阳' ), ( 4307, '湖南', '常德' ), ( 4308, '湖南', '张家界' ), ( 4309, '湖南', '益阳' ), ( 4310, '湖南', '郴州' ), ( 4311, '湖南', '永州' ), ( 4312, '湖南', '怀化' ), ( 4313, '湖南', '娄底' ), ( 4331, '湖南', '湘西土家族苗族自治州' ), ( 4401, '广东', '广州' ), ( 4402, '广东', '韶关' ), ( 4403, '广东', '深圳' ), ( 4404, '广东', '珠海' ), ( 4405, '广东', '汕头' ), ( 4406, '广东', '佛山' ), ( 4407, '广东', '江门' ), ( 4408, '广东', '湛江' ), ( 4409, '广东', '茂名' ), ( 4412, '广东', '肇庆' ), ( 4413, '广东', '惠州' ), ( 4414, '广东', '梅州' ), ( 4415, '广东', '汕尾' ), ( 4416, '广东', '河源' ), ( 4417, '广东', '阳江' ), ( 4418, '广东', '清远' ), ( 4419, '广东', '东莞' ), ( 4420, '广东', '中山' ), ( 4451, '广东', '潮州' ), ( 4452, '广东', '揭阳' ), ( 4453, '广东', '云浮' ), ( 4501, '广西', '南宁' ), ( 4502, '广西', '柳州' ), ( 4503, '广西', '桂林' ), ( 4504, '广西', '梧州' ), ( 4505, '广西', '北海' ), ( 4506, '广西', '防城港' ), ( 4507, '广西', '钦州' ), ( 4508, '广西', '贵港' ), ( 4509, '广西', '玉林' ), ( 4510, '广西', '百色' ), ( 4511, '广西', '贺州' ), ( 4512, '广西', '河池' ), ( 4513, '广西', '来宾' ), ( 4514, '广西', '崇左' ), ( 4601, '海南', '海口' ), ( 4602, '海南', '三亚' ), ( 4603, '海南', '三沙' ), ( 4604, '海南', '儋州' ), ( 4690, '海南', '省直辖县级行政单位' ), ( 5001, '重庆', '重庆' ), ( 5101, '四川', '成都' ), ( 5103, '四川', '自贡' ), ( 5104, '四川', '攀枝花' ), ( 5105, '四川', '泸州' ), ( 5106, '四川', '德阳' ), ( 5107, '四川', '绵阳' ), ( 5108, '四川', '广元' ), ( 5109, '四川', '遂宁' ), ( 5110, '四川', '内江' ), ( 5111, '四川', '乐山' ), ( 5113, '四川', '南充' ), ( 5114, '四川', '眉山' ), ( 5115, '四川', '宜宾' ), ( 5116, '四川', '广安' ), ( 5117, '四川', '达州' ), ( 5118, '四川', '雅安' ), ( 5119, '四川', '巴中' ), ( 5120, '四川', '资阳' ), ( 5132, '四川', '阿坝藏族羌族自治州' ), ( 5133, '四川', '甘孜藏族自治州' ), ( 5134, '四川', '凉山彝族自治州' ), ( 5201, '贵州', '贵阳' ), ( 5202, '贵州', '六盘水' ), ( 5203, '贵州', '遵义' ), ( 5204, '贵州', '安顺' ), ( 5205, '贵州', '毕节' ), ( 5206, '贵州', '铜仁' ), ( 5223, '贵州', '黔西南布依族苗族自治州' ), ( 5226, '贵州', '黔东南苗族侗族自治州' ), ( 5227, '贵州', '黔南布依族苗族自治州' ), ( 5301, '云南', '昆明' ), ( 5303, '云南', '曲靖' ), ( 5304, '云南', '玉溪' ), ( 5305, '云南', '保山' ), ( 5306, '云南', '昭通' ), ( 5307, '云南', '丽江' ), ( 5308, '云南', '普洱' ), ( 5309, '云南', '临沧' ), ( 5323, '云南', '楚雄彝族自治州' ), ( 5325, '云南', '红河哈尼族彝族自治州' ), ( 5326, '云南', '文山壮族苗族自治州' ), ( 5328, '云南', '西双版纳傣族自治州' ), ( 5329, '云南', '大理白族自治州' ), ( 5331, '云南', '德宏傣族景颇族自治州' ), ( 5333, '云南', '怒江傈僳族自治州' ), ( 5334, '云南', '迪庆藏族自治州' ), ( 5401, '西藏', '拉萨' ), ( 5402, '西藏', '日喀则' ), ( 5403, '西藏', '昌都' ), ( 5404, '西藏', '林芝' ), ( 5405, '西藏', '山南' ), ( 5406, '西藏', '那曲' ), ( 5425, '西藏', '阿里地区' ), ( 6101, '陕西', '西安' ), ( 6102, '陕西', '铜川' ), ( 6103, '陕西', '宝鸡' ), ( 6104, '陕西', '咸阳' ), ( 6105, '陕西', '渭南' ), ( 6106, '陕西', '延安' ), ( 6107, '陕西', '汉中' ), ( 6108, '陕西', '榆林' ), ( 6109, '陕西', '安康' ), ( 6110, '陕西', '商洛' ), ( 6201, '甘肃', '兰州' ), ( 6202, '甘肃', '嘉峪关' ), ( 6203, '甘肃', '金昌' ), ( 6204, '甘肃', '白银' ), ( 6205, '甘肃', '天水' ), ( 6206, '甘肃', '武威' ), ( 6207, '甘肃', '张掖' ), ( 6208, '甘肃', '平凉' ), ( 6209, '甘肃', '酒泉' ), ( 6210, '甘肃', '庆阳' ), ( 6211, '甘肃', '定西' ), ( 6212, '甘肃', '陇南' ), ( 6229, '甘肃', '临夏回族自治州' ), ( 6230, '甘肃', '甘南藏族自治州' ), ( 6301, '青海', '西宁' ), ( 6302, '青海', '海东' ), ( 6322, '青海', '海北藏族自治州' ), ( 6323, '青海', '黄南藏族自治州' ), ( 6325, '青海', '海南藏族自治州' ), ( 6326, '青海', '果洛藏族自治州' ), ( 6327, '青海', '玉树藏族自治州' ), ( 6328, '青海', '海西蒙古族藏族自治州' ), ( 6401, '宁夏', '银川' ), ( 6402, '宁夏', '石嘴山' ), ( 6403, '宁夏', '吴忠' ), ( 6404, '宁夏', '固原' ), ( 6405, '宁夏', '中卫' ), ( 6501, '新疆', '乌鲁木齐' ), ( 6502, '新疆', '克拉玛依' ), ( 6504, '新疆', '吐鲁番' ), ( 6505, '新疆', '哈密' ), ( 6523, '新疆', '昌吉回族自治州' ), ( 6527, '新疆', '博尔塔拉蒙古自治州' ), ( 6528, '新疆', '巴音郭楞' ), (6530, '新疆', '克孜勒苏州' ), ( 6531, '新疆', '喀什地区' ), ( 6532, '新疆', '和田地区' ), ( 6540, '新疆', '伊犁州' ), ( 6542, '新疆', '塔城地区' ), ( 6590, '新疆', '石河子' ); `