根据身份证号,使用Java编写程序获取年龄、性别、出生日期

转自:http://blog.csdn.net/dabing69221/article/details/9150819


程序员必须要有一个好的思想,代码有时候就体现了一个人的灵魂,所以理解需求比技术更重要!

IdcardValidator类

  1. import java.text.ParseException;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.GregorianCalendar;  
  6. import java.util.regex.Pattern;  
  7.   
  8. public class IdcardValidator {  
  9.     /** 
  10.      * 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", 
  11.      * 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", 
  12.      * 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", 
  13.      * 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", 
  14.      * 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", 
  15.      * 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} 
  16.      */  
  17.     protected String codeAndCity[][] = { { "11""北京" }, { "12""天津" },  
  18.             { "13""河北" }, { "14""山西" }, { "15""内蒙古" }, { "21""辽宁" },  
  19.             { "22""吉林" }, { "23""黑龙江" }, { "31""上海" }, { "32""江苏" },  
  20.             { "33""浙江" }, { "34""安徽" }, { "35""福建" }, { "36""江西" },  
  21.             { "37""山东" }, { "41""河南" }, { "42""湖北" }, { "43""湖南" },  
  22.             { "44""广东" }, { "45""广西" }, { "46""海南" }, { "50""重庆" },  
  23.             { "51""四川" }, { "52""贵州" }, { "53""云南" }, { "54""西藏" },  
  24.             { "61""陕西" }, { "62""甘肃" }, { "63""青海" }, { "64""宁夏" },  
  25.             { "65""新疆" }, { "71""台湾" }, { "81""香港" }, { "82""澳门" },  
  26.             { "91""国外" } };  
  27.   
  28.     private String cityCode[] = { "11""12""13""14""15""21""22",  
  29.             "23""31""32""33""34""35""36""37""41""42""43",  
  30.             "44""45""46""50""51""52""53""54""61""62""63",  
  31.             "64""65""71""81""82""91" };  
  32.   
  33.     // 每位加权因子  
  34.     private int power[] = { 7910584216379105842 };  
  35.   
  36.     // 第18位校检码  
  37.     private String verifyCode[] = { "1""0""X""9""8""7""6""5",  
  38.             "4""3""2" };  
  39.   
  40.     /** 
  41.      * 验证所有的身份证的合法性 
  42.      *  
  43.      * @param idcard 
  44.      * @return 
  45.      */  
  46.     public boolean isValidatedAllIdcard(String idcard) {  
  47.         if (idcard.length() == 15) {  
  48.             idcard = this.convertIdcarBy15bit(idcard);  
  49.         }  
  50.         return this.isValidate18Idcard(idcard);  
  51.     }  
  52.   
  53.     /** 
  54.      * <p> 
  55.      * 判断18位身份证的合法性 
  56.      * </p> 
  57.      * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 
  58.      * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 
  59.      * <p> 
  60.      * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 
  61.      * </p> 
  62.      * <p> 
  63.      * 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码; 
  64.      * 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码; 
  65.      * 6.第17位数字表示性别:奇数表示男性,偶数表示女性; 
  66.      * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 
  67.      * </p> 
  68.      * <p> 
  69.      * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 
  70.      * 2 1 6 3 7 9 10 5 8 4 2 
  71.      * </p> 
  72.      * <p> 
  73.      * 2.将这17位数字和系数相乘的结果相加。 
  74.      * </p> 
  75.      * <p> 
  76.      * 3.用加出来和除以11,看余数是多少? 
  77.      * </p> 
  78.      * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 
  79.      * 2。 
  80.      * <p> 
  81.      * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 
  82.      * </p> 
  83.      *  
  84.      * @param idcard 
  85.      * @return 
  86.      */  
  87.     public boolean isValidate18Idcard(String idcard) {  
  88.         // 非18位为假  
  89.         if (idcard.length() != 18) {  
  90.             return false;  
  91.         }  
  92.         // 获取前17位  
  93.         String idcard17 = idcard.substring(017);  
  94.         // 获取第18位  
  95.         String idcard18Code = idcard.substring(1718);  
  96.         char c[] = null;  
  97.         String checkCode = "";  
  98.         // 是否都为数字  
  99.         if (isDigital(idcard17)) {  
  100.             c = idcard17.toCharArray();  
  101.         } else {  
  102.             return false;  
  103.         }  
  104.   
  105.         if (null != c) {  
  106.             int bit[] = new int[idcard17.length()];  
  107.   
  108.             bit = converCharToInt(c);  
  109.   
  110.             int sum17 = 0;  
  111.   
  112.             sum17 = getPowerSum(bit);  
  113.   
  114.             // 将和值与11取模得到余数进行校验码判断  
  115.             checkCode = getCheckCodeBySum(sum17);  
  116.             if (null == checkCode) {  
  117.                 return false;  
  118.             }  
  119.             // 将身份证的第18位与算出来的校码进行匹配,不相等就为假  
  120.             if (!idcard18Code.equalsIgnoreCase(checkCode)) {  
  121.                 return false;  
  122.             }  
  123.         }  
  124.         return true;  
  125.     }  
  126.   
  127.     /** 
  128.      * 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 
  129.      *  
  130.      * @param idcard 
  131.      * @return 
  132.      */  
  133.     public boolean isValidate15Idcard(String idcard) {  
  134.         // 非15位为假  
  135.         if (idcard.length() != 15) {  
  136.             return false;  
  137.         }  
  138.   
  139.         // 是否全都为数字  
  140.         if (isDigital(idcard)) {  
  141.             String provinceid = idcard.substring(02);  
  142.             String birthday = idcard.substring(612);  
  143.             int year = Integer.parseInt(idcard.substring(68));  
  144.             int month = Integer.parseInt(idcard.substring(810));  
  145.             int day = Integer.parseInt(idcard.substring(1012));  
  146.   
  147.             // 判断是否为合法的省份  
  148.             boolean flag = false;  
  149.             for (String id : cityCode) {  
  150.                 if (id.equals(provinceid)) {  
  151.                     flag = true;  
  152.                     break;  
  153.                 }  
  154.             }  
  155.             if (!flag) {  
  156.                 return false;  
  157.             }  
  158.             // 该身份证生出日期在当前日期之后时为假  
  159.             Date birthdate = null;  
  160.             try {  
  161.                 birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);  
  162.             } catch (ParseException e) {  
  163.                 e.printStackTrace();  
  164.             }  
  165.             if (birthdate == null || new Date().before(birthdate)) {  
  166.                 return false;  
  167.             }  
  168.   
  169.             // 判断是否为合法的年份  
  170.             GregorianCalendar curDay = new GregorianCalendar();  
  171.             int curYear = curDay.get(Calendar.YEAR);  
  172.             int year2bit = Integer.parseInt(String.valueOf(curYear)  
  173.                     .substring(2));  
  174.   
  175.             // 判断该年份的两位表示法,小于50的和大于当前年份的,为假  
  176.             if ((year < 50 && year > year2bit)) {  
  177.                 return false;  
  178.             }  
  179.   
  180.             // 判断是否为合法的月份  
  181.             if (month < 1 || month > 12) {  
  182.                 return false;  
  183.             }  
  184.   
  185.             // 判断是否为合法的日期  
  186.             boolean mflag = false;  
  187.             curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDay  
  188.             switch (month) {  
  189.             case 1:  
  190.             case 3:  
  191.             case 5:  
  192.             case 7:  
  193.             case 8:  
  194.             case 10:  
  195.             case 12:  
  196.                 mflag = (day >= 1 && day <= 31);  
  197.                 break;  
  198.             case 2// 公历的2月非闰年有28天,闰年的2月是29天。  
  199.                 if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) {  
  200.                     mflag = (day >= 1 && day <= 29);  
  201.                 } else {  
  202.                     mflag = (day >= 1 && day <= 28);  
  203.                 }  
  204.                 break;  
  205.             case 4:  
  206.             case 6:  
  207.             case 9:  
  208.             case 11:  
  209.                 mflag = (day >= 1 && day <= 30);  
  210.                 break;  
  211.             }  
  212.             if (!mflag) {  
  213.                 return false;  
  214.             }  
  215.         } else {  
  216.             return false;  
  217.         }  
  218.         return true;  
  219.     }  
  220.   
  221.     /** 
  222.      * 将15位的身份证转成18位身份证 
  223.      *  
  224.      * @param idcard 
  225.      * @return 
  226.      */  
  227.     public String convertIdcarBy15bit(String idcard) {  
  228.         String idcard17 = null;  
  229.         // 非15位身份证  
  230.         if (idcard.length() != 15) {  
  231.             return null;  
  232.         }  
  233.   
  234.         if (isDigital(idcard)) {  
  235.             // 获取出生年月日  
  236.             String birthday = idcard.substring(612);  
  237.             Date birthdate = null;  
  238.             try {  
  239.                 birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);  
  240.             } catch (ParseException e) {  
  241.                 e.printStackTrace();  
  242.             }  
  243.             Calendar cday = Calendar.getInstance();  
  244.             cday.setTime(birthdate);  
  245.             String year = String.valueOf(cday.get(Calendar.YEAR));  
  246.   
  247.             idcard17 = idcard.substring(06) + year + idcard.substring(8);  
  248.   
  249.             char c[] = idcard17.toCharArray();  
  250.             String checkCode = "";  
  251.   
  252.             if (null != c) {  
  253.                 int bit[] = new int[idcard17.length()];  
  254.   
  255.                 // 将字符数组转为整型数组  
  256.                 bit = converCharToInt(c);  
  257.                 int sum17 = 0;  
  258.                 sum17 = getPowerSum(bit);  
  259.   
  260.                 // 获取和值与11取模得到余数进行校验码  
  261.                 checkCode = getCheckCodeBySum(sum17);  
  262.                 // 获取不到校验位  
  263.                 if (null == checkCode) {  
  264.                     return null;  
  265.                 }  
  266.   
  267.                 // 将前17位与第18位校验码拼接  
  268.                 idcard17 += checkCode;  
  269.             }  
  270.         } else { // 身份证包含数字  
  271.             return null;  
  272.         }  
  273.         return idcard17;  
  274.     }  
  275.   
  276.     /** 
  277.      * 15位和18位身份证号码的基本数字和位数验校 
  278.      *  
  279.      * @param idcard 
  280.      * @return 
  281.      */  
  282.     public boolean isIdcard(String idcard) {  
  283.         return idcard == null || "".equals(idcard) ? false : Pattern.matches(  
  284.                 "(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)", idcard);  
  285.     }  
  286.   
  287.     /** 
  288.      * 15位身份证号码的基本数字和位数验校 
  289.      *  
  290.      * @param idcard 
  291.      * @return 
  292.      */  
  293.     public boolean is15Idcard(String idcard) {  
  294.         return idcard == null || "".equals(idcard) ? false : Pattern.matches(  
  295.                 "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$",  
  296.                 idcard);  
  297.     }  
  298.   
  299.     /** 
  300.      * 18位身份证号码的基本数字和位数验校 
  301.      *  
  302.      * @param idcard 
  303.      * @return 
  304.      */  
  305.     public boolean is18Idcard(String idcard) {  
  306.         return Pattern  
  307.                 .matches(  
  308.                         "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$",  
  309.                         idcard);  
  310.     }  
  311.   
  312.     /** 
  313.      * 数字验证 
  314.      *  
  315.      * @param str 
  316.      * @return 
  317.      */  
  318.     public boolean isDigital(String str) {  
  319.         return str == null || "".equals(str) ? false : str.matches("^[0-9]*$");  
  320.     }  
  321.   
  322.     /** 
  323.      * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 
  324.      *  
  325.      * @param bit 
  326.      * @return 
  327.      */  
  328.     public int getPowerSum(int[] bit) {  
  329.   
  330.         int sum = 0;  
  331.   
  332.         if (power.length != bit.length) {  
  333.             return sum;  
  334.         }  
  335.   
  336.         for (int i = 0; i < bit.length; i++) {  
  337.             for (int j = 0; j < power.length; j++) {  
  338.                 if (i == j) {  
  339.                     sum = sum + bit[i] * power[j];  
  340.                 }  
  341.             }  
  342.         }  
  343.         return sum;  
  344.     }  
  345.   
  346.     /** 
  347.      * 将和值与11取模得到余数进行校验码判断 
  348.      *  
  349.      * @param checkCode 
  350.      * @param sum17 
  351.      * @return 校验位 
  352.      */  
  353.     public String getCheckCodeBySum(int sum17) {  
  354.         String checkCode = null;  
  355.         switch (sum17 % 11) {  
  356.         case 10:  
  357.             checkCode = "2";  
  358.             break;  
  359.         case 9:  
  360.             checkCode = "3";  
  361.             break;  
  362.         case 8:  
  363.             checkCode = "4";  
  364.             break;  
  365.         case 7:  
  366.             checkCode = "5";  
  367.             break;  
  368.         case 6:  
  369.             checkCode = "6";  
  370.             break;  
  371.         case 5:  
  372.             checkCode = "7";  
  373.             break;  
  374.         case 4:  
  375.             checkCode = "8";  
  376.             break;  
  377.         case 3:  
  378.             checkCode = "9";  
  379.             break;  
  380.         case 2:  
  381.             checkCode = "x";  
  382.             break;  
  383.         case 1:  
  384.             checkCode = "0";  
  385.             break;  
  386.         case 0:  
  387.             checkCode = "1";  
  388.             break;  
  389.         }  
  390.         return checkCode;  
  391.     }  
  392.   
  393.     /** 
  394.      * 将字符数组转为整型数组 
  395.      *  
  396.      * @param c 
  397.      * @return 
  398.      * @throws NumberFormatException 
  399.      */  
  400.     public int[] converCharToInt(char[] c) throws NumberFormatException {  
  401.         int[] a = new int[c.length];  
  402.         int k = 0;  
  403.         for (char temp : c) {  
  404.             a[k++] = Integer.parseInt(String.valueOf(temp));  
  405.         }  
  406.         return a;  
  407.     }  
  408.   
  409.     public static void main(String[] args) throws Exception {  
  410.           
  411.         String idcard15 = "";  
  412.         String idcard18 = "";  
  413.         IdcardValidator iv = new IdcardValidator();  
  414.         boolean flag = false;  
  415.         flag = iv.isValidate18Idcard(idcard18);  
  416.         System.out.println(flag);  
  417.   
  418.         flag = iv.isValidate15Idcard(idcard15);  
  419.         System.out.println(flag);  
  420.   
  421.         System.out.println(iv.convertIdcarBy15bit(idcard15));  
  422.         flag = iv.isValidate18Idcard(iv.convertIdcarBy15bit(idcard15));  
  423.         System.out.println(flag);  
  424.   
  425.         System.out.println(iv.isValidatedAllIdcard(idcard18));  
  426.   
  427.     }  
  428. }  

IdcardInfoExtractor类:
  1. import java.text.SimpleDateFormat;  
  2. import java.util.Calendar;  
  3. import java.util.Date;  
  4. import java.util.GregorianCalendar;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import java.util.Set;  
  8.   
  9.   
  10. public class IdcardInfoExtractor {  
  11.       
  12.      // 省份    
  13.     private String province;    
  14.     // 城市    
  15.     private String city;    
  16.     // 区县    
  17.     private String region;    
  18.     // 年份    
  19.     private int year;    
  20.     // 月份    
  21.     private int month;    
  22.     // 日期    
  23.     private int day;    
  24.     // 性别    
  25.     private String gender;    
  26.     // 出生日期    
  27.     private Date birthday;   
  28.     //年龄  
  29.     private int age;  
  30.     
  31.     private Map<String, String> cityCodeMap = new HashMap<String, String>() {    
  32.         {    
  33.             this.put("11""北京");    
  34.             this.put("12""天津");    
  35.             this.put("13""河北");    
  36.             this.put("14""山西");    
  37.             this.put("15""内蒙古");    
  38.             this.put("21""辽宁");    
  39.             this.put("22""吉林");    
  40.             this.put("23""黑龙江");    
  41.             this.put("31""上海");    
  42.             this.put("32""江苏");    
  43.             this.put("33""浙江");    
  44.             this.put("34""安徽");    
  45.             this.put("35""福建");    
  46.             this.put("36""江西");    
  47.             this.put("37""山东");    
  48.             this.put("41""河南");    
  49.             this.put("42""湖北");    
  50.             this.put("43""湖南");    
  51.             this.put("44""广东");    
  52.             this.put("45""广西");    
  53.             this.put("46""海南");    
  54.             this.put("50""重庆");    
  55.             this.put("51""四川");    
  56.             this.put("52""贵州");    
  57.             this.put("53""云南");    
  58.             this.put("54""西藏");    
  59.             this.put("61""陕西");    
  60.             this.put("62""甘肃");    
  61.             this.put("63""青海");    
  62.             this.put("64""宁夏");    
  63.             this.put("65""新疆");    
  64.             this.put("71""台湾");    
  65.             this.put("81""香港");    
  66.             this.put("82""澳门");    
  67.             this.put("91""国外");    
  68.         }    
  69.     };    
  70.         
  71.     private IdcardValidator validator = null;    
  72.         
  73.     /**  
  74.      * 通过构造方法初始化各个成员属性  
  75.      */    
  76.     public IdcardInfoExtractor(String idcard) {    
  77.         try {    
  78.             validator = new IdcardValidator();    
  79.             if (validator.isValidatedAllIdcard(idcard)) {    
  80.                 if (idcard.length() == 15) {    
  81.                     idcard = validator.convertIdcarBy15bit(idcard);    
  82.                 }    
  83.                 // 获取省份    
  84.                 String provinceId = idcard.substring(02);    
  85.                 Set<String> key = this.cityCodeMap.keySet();    
  86.                 for (String id : key) {    
  87.                     if (id.equals(provinceId)) {    
  88.                         this.province = this.cityCodeMap.get(id);    
  89.                         break;    
  90.                     }    
  91.                 }    
  92.     
  93.                 // 获取性别    
  94.                 String id17 = idcard.substring(1617);    
  95.                 if (Integer.parseInt(id17) % 2 != 0) {    
  96.                     this.gender = "男";    
  97.                 } else {    
  98.                     this.gender = "女";    
  99.                 }    
  100.     
  101.                 // 获取出生日期    
  102.                 String birthday = idcard.substring(614);    
  103.                 Date birthdate = new SimpleDateFormat("yyyyMMdd")    
  104.                         .parse(birthday);    
  105.                 this.birthday = birthdate;    
  106.                 GregorianCalendar currentDay = new GregorianCalendar();    
  107.                 currentDay.setTime(birthdate);    
  108.                 this.year = currentDay.get(Calendar.YEAR);    
  109.                 this.month = currentDay.get(Calendar.MONTH) + 1;    
  110.                 this.day = currentDay.get(Calendar.DAY_OF_MONTH);    
  111.                   
  112.                 //获取年龄  
  113.                 SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy");  
  114.                 String year=simpleDateFormat.format(new Date());  
  115.                 this.age=Integer.parseInt(year)-this.year;  
  116.                   
  117.             }    
  118.         } catch (Exception e) {    
  119.             e.printStackTrace();    
  120.         }    
  121.     }    
  122.     
  123.     /**  
  124.      * @return the province  
  125.      */    
  126.     public String getProvince() {    
  127.         return province;    
  128.     }    
  129.     
  130.     /**  
  131.      * @return the city  
  132.      */    
  133.     public String getCity() {    
  134.         return city;    
  135.     }    
  136.     
  137.     /**  
  138.      * @return the region  
  139.      */    
  140.     public String getRegion() {    
  141.         return region;    
  142.     }    
  143.     
  144.     /**  
  145.      * @return the year  
  146.      */    
  147.     public int getYear() {    
  148.         return year;    
  149.     }    
  150.     
  151.     /**  
  152.      * @return the month  
  153.      */    
  154.     public int getMonth() {    
  155.         return month;    
  156.     }    
  157.     
  158.     /**  
  159.      * @return the day  
  160.      */    
  161.     public int getDay() {    
  162.         return day;    
  163.     }    
  164.     
  165.     /**  
  166.      * @return the gender  
  167.      */    
  168.     public String getGender() {    
  169.         return gender;    
  170.     }    
  171.     
  172.     /**  
  173.      * @return the birthday  
  174.      */    
  175.     public Date getBirthday() {    
  176.         return birthday;    
  177.     }    
  178.     
  179.     @Override    
  180.     public String toString() {    
  181.         return "省份:" + this.province + ",性别:" + this.gender + ",出生日期:"    
  182.                 + this.birthday;    
  183.     }    
  184.     
  185.     public static void main(String[] args) {    
  186.         String idcard = "";    
  187.         IdcardInfoExtractor ie = new IdcardInfoExtractor(idcard);    
  188.         System.out.println(ie.toString());    
  189.     }  
  190.   
  191.     public int getAge() {  
  192.         return age;  
  193.     }  
  194.   
  195.     public void setAge(int age) {  
  196.         this.age = age;  
  197.     }    
  198.       
  199. }  

测试类:
  1. import java.util.Date;  
  2.   
  3.   
  4. public class Test {  
  5.     public static void main(String[] args) {  
  6.           
  7.         IdcardInfoExtractor idcardInfo=new IdcardInfoExtractor("372323199001061825");  
  8.         System.out.println("出生日期:"+idcardInfo.getYear()+"-"+idcardInfo.getMonth()+"-"+idcardInfo.getDay());  
  9.         System.out.println("性别:"+idcardInfo.getGender());  
  10.         System.out.println("年龄:"+idcardInfo.getAge());  
  11.         System.out.println("省份:"+idcardInfo.getProvince());  
  12.           
  13.     }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值