ismart-doc
Version:
API documentation generator,base in https://github.com/mhbseal/modoc
133 lines (127 loc) • 3.45 kB
JavaScript
/**
* 身份证的校验以及从从身份证号码中获取一些信息,例如出生日期,性别
*
* @author hbmu
* @date 2014/10/21
*
* @name IdCard
* @more 身份证规则
* =====================================================================
* 身份证15位编码规则 -- dddddd yymmdd xx p
* dddddd : 地区码
* yymmdd : 出生年月日
* xx : 顺序类编码,无法确定
* p : 性别,奇数为男,偶数为女
*
* 身份证18位编码规则 -- dddddd yyyymmdd xxx y
* dddddd : 地区码
* yyyymmdd : 出生年月日
* xxx : 顺序类编码,无法确定,奇数为男,偶数为女
* y : 校验码,该位数值可通过前17位计算获得
*
* 18位号码加权因子为 : WI = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
* 校验位集合 : CODE = [1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2]
* 校验位index计算公式 : index = mod(∑(ai×Wi), 11)
* =====================================================================
*/
define(function () {
"use strict";
var
WI = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1],
CODE = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
/**
* 构造函数
*
* @param {string} 身份证号,这里必须是string格式,因为身份证号超出了js的整数精度范围
*
* @name IdCard
* @grammar new IdCard(num)
* @example
* var idCard = new IdCard('610125198711037137');
*/
function IdCard(num) {
this.num = num;
};
/**
* 验证校验位,针对18位
*
* @return {boolean}
*
* @name checkCode
* @example
* idCard.checkCode() => true
*/
IdCard.prototype.checkCode = function() {
var num = this.num;
if (num.length === 18) {
var
sum = 0,
i = 0;
for(; i < 17; i++) {
sum += WI[i] * num[i]
};
if (num[17].toUpperCase() !== String(CODE[sum % 11])) return false;
}
return true;
};
/**
* 验证出生日期
*
* @return {boolean}
*
* @name checkBirth
* @example
* idCard.checkBirth() => true
*/
IdCard.prototype.checkBirth = function() {
var
birth = this.getBirth(),
date = new Date(birth.year, birth.month - 1, birth.day),
newYear = date.getFullYear(),
newMonth = date.getMonth() + 1,
newDay = date.getDate(),
now = new Date();
if (+birth.year !== newYear || +birth.month !== newMonth || +birth.day !== newDay || date > now) return false;
return true;
};
/**
* 获取出生日期
*
* @return {object} 返回对象
* - year {number}
* - month {number}
* - day {number}
*
* @name getBirth
* @example
* idCard.getBirth() => {year: '1987', month: '11', day: '03'}
*/
IdCard.prototype.getBirth = function() {
var num = this.num;
if (num.length === 15) num = num.slice(0, 6) + "19" + num.slice(6, 16); // 修正15位的年月日
return {
year: num.slice(6, 10),
month: num.slice(10, 12),
day: num.slice(12, 14)
};
};
/**
* 获取性别
*
* @return {string}
*
* @name getSex
* @example
* idCard.getSex() => '男'
*/
IdCard.prototype.getSex = function() {
var sex, num = this.num;
if(num.length === 18) {
sex = num.substr(-2, 1) % 2;
}else {
sex = num.substr(-1, 1) % 2;
}
return sex ? '男' : '女';
};
return IdCard;
});