React的嚴格的18位身份證格式校驗

這個也沒什麼需求只是自己賢者無聊打發時間優化的一下代碼,這個其實有個隱藏的祕密,就是當你們的測試是個小姐姐的時候,你不知道別人多大,有想知道而不敢問的時候,就可以把這個校驗加的嚴格些,這樣她亂輸入是不會校驗過的,必須輸入正確的纔會過,是不是有壞啊,不過有點頭腦的小姐姐百度隨便一查都能查到生成身份證號碼的工具了,這就聊的後話了,如果你們的證件選擇只有一個可以這樣玩,但是如果有多個你自己還要去進行判斷用戶選擇的下拉框的證件類型來判斷不同的證件號這個就要自己去寫和修改了,
這裏還插入一個自己常用的在線省份證號碼生成工具吧。

在線省份證號碼生成工具

//身份證輸入文本框
<FormItem label="證件號碼">
	{getFieldDecorator('crdtNo', {
	    initialValue: '',
	    validateTrigger: 'onBlur',                     
	    rules: [
	      {
	        required: true,
	        validator: this.checkLength,
	      },
	    ],
	  })(<Input placeholder="必填 請輸入號碼" />)}
</FormItem>
//  身份證校驗規則
  checkLength = (rule, value, callback) => {
    if (this.checkIDCard(value)) {
      callback();
    } else {
      callback('請輸入正確的身份證號碼');
    }
  }

  checkIDCard = (value) => {
    // 加權因子
    const weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    // 校驗碼
    const check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    const code = value + '';
    const last = value[17];

    const seventeen = code.substring(0, 17);
    
	 // ISO 7064:1983.MOD 11-2
    // 判斷最後一位校驗碼是否正確
    const arr = seventeen.split('');
    const len = arr.length;
    let num = 0;
    for (let i = 0; i < len; i += 1) {
      num += (arr[i] * weight_factor[i]);
    }

    // 獲取餘數
    const resisue = num % 11;
    const last_no = check_code[resisue];

	// 格式的正則
    // 正則思路
    /*
    第一位不可能是0
    第二位到第六位可以是0-9
    第七位到第十位是年份,所以七八位爲19或者20
    十一位和十二位是月份,這兩位是01-12之間的數值
    十三位和十四位是日期,是從01-31之間的數值
    十五,十六,十七都是數字0-9
    十八位可能是數字0-9,也可能是X
    */
    const idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;

    // 判斷格式是否正確
    const format = idcard_patter.test(value);

    // 返回驗證結果,校驗碼和格式同時正確纔算是合法的身份證號碼
    return last === last_no && format;
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章