1 基本数据类型

  参见W3C的教程即可

2 正则表达式

  参考博文:点击前往

3 身份证校验

  参考博文:点击前往

  1. <div class="panel panel-primary">
  2. <div class="panel-heading">身份证编号验证</div>
  3. <div class="panel-body div_body">
  4. <div class="form_div">
  5. <form (ngSubmit)="onNgSubmit()" [formGroup]="idcardForm">
  6. <mat-form-field>
  7. <input type="number" matInput matTooltip="身份证前六位数字代表地址信息" placeholder="请输入身份证前6位" formControlName="address" />
  8. <mat-error *ngIf="idcardForm.hasError('required', 'address')">
  9. <span>6为地址是必填项</span>
  10. </mat-error>
  11. <mat-error *ngIf="idcardForm.hasError('addressFormatValidator', 'address')">
  12. <span>{{idcardForm.getError('addressFormatValidator', 'address')?.desc}}</span>
  13. </mat-error>
  14. <mat-error *ngIf="idcardForm.hasError('addressLengthValidator', 'address')">
  15. <span>{{idcardForm.getError('addressLengthValidator', 'address')?.desc}}</span>
  16. </mat-error>
  17. </mat-form-field>
  18. <mat-form-field>
  19. <input type="number" matInput matTooltip="身份证的第7到10位代表出生年份" placeholder="请输入年份" formControlName="year" />
  20. <mat-error *ngIf="idcardForm.hasError('required', 'year')">
  21. <span>4为年份是必填项</span>
  22. </mat-error>
  23. <mat-error *ngIf="idcardForm.hasError('yearFormatValidator', 'year')">
  24. <span>{{ idcardForm.getError('yearFormatValidator', 'year')?.desc }}</span>
  25. </mat-error>
  26. </mat-form-field>
  27. <mat-form-field>
  28. <input type="number" matInput matTooltip="身份证第11到12位代表出生月份" formControlName="month" placeholder="请输入出生月份" />
  29. <mat-error *ngIf="idcardForm.hasError('required', 'month')">
  30. <span>2位出生月份是必填项</span>
  31. </mat-error>
  32. <mat-error *ngIf="idcardForm.hasError('monthFormatValidator', 'month')">
  33. <span>{{idcardForm.getError('monthFormatValidator', 'month')?.desc}}</span>
  34. </mat-error>
  35. </mat-form-field>
  36. <mat-form-field>
  37. <input type="number" matInput matTooltip="身份证的第13到14位代表出生天数" placeholder="请输入出生天数" formControlName="day" />
  38. <mat-error *ngIf="idcardForm.hasError('required', 'day')">
  39. <span>2位出生天数是必填项</span>
  40. </mat-error>
  41. <mat-error *ngIf="idcardForm.hasError('dayFormatValidator', 'day')">
  42. <span>{{idcardForm.getError('dayFormatValidator', 'day')?.desc}}</span>
  43. </mat-error>
  44. </mat-form-field>
  45. <mat-form-field>
  46. <input type="number" matInput matTooltip="身份证的15到17位数字代表顺序码" formControlName="sequenceCode" placeholder="请输入顺序码" />
  47. <mat-error *ngIf="idcardForm.hasError('required', 'sequenceCode')">
  48. <span>顺序码是必填项</span>
  49. </mat-error>
  50. <mat-error *ngIf="idcardForm.hasError('sequenceCodeValidator', 'sequenceCode')">
  51. <span>{{idcardForm.getError('sequenceCodeValidator', 'sequenceCode')?.desc}}</span>
  52. </mat-error>
  53. </mat-form-field>
  54. <mat-form-field>
  55. <input type="text" matInput matTooltip="身份证最后一位是校验码" formControlName="checkCode" placeholder="请输入校验码" />
  56. <mat-error *ngIf="idcardForm.hasError('required', 'checkCode')">
  57. <span>校验码是必填项</span>
  58. </mat-error>
  59. <mat-error *ngIf="idcardForm.hasError('checkCodeValidator', 'checkCode')">
  60. <span>{{idcardForm.getError('checkCodeValidator', 'checkCode')?.desc}}</span>
  61. </mat-error>
  62. </mat-form-field>
  63. <mat-form-field>
  64. <input type="text" matInput matTooltip="中国的公民身份证编号总共有18位" formControlName="idcard" placeholder="请输入身份证编号" />
  65. <mat-error *ngIf="idcardForm.hasError('required', 'idcard')">
  66. <span>身份证是必填项</span>
  67. </mat-error>
  68. <mat-error *ngIf="idcardForm.hasError('idcardValidator', 'idcard')">
  69. <span>{{idcardForm.getError('idcardValidator', 'idcard')?.desc}}</span>
  70. </mat-error>
  71. </mat-form-field>
  72. <br />
  73. <br />
  74. <div>
  75. <button mat-raised-button [disabled]="!idcardForm.valid" type="submit" >提交</button>
  76. </div>
  77. </form>
  78. </div>
  79. </div>
  80. <div class="panel-footer">2018-3-15 09:42:00</div>
  81. </div>

HTML

  1. import { Component, OnInit } from '@angular/core';
  2. import { HttpClient } from '@angular/common/http';
  3. import { Http } from '@angular/http';
  4. import { TestService } from '../test.service';
  5. import { ClientBaseInfo } from '../../model/ClientBaseInfo';
  6. import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
  7. import 'rxjs/add/operator/debounceTime';
  8.  
  9. @Component({
  10. selector: 'app-test-demo',
  11. templateUrl: './test-demo.component.html',
  12. styleUrls: ['./test-demo.component.scss']
  13. })
  14. export class TestDemoComponent implements OnInit {
  15.  
  16. idcardForm: FormGroup;
  17.  
  18. constructor(
  19. private formBuilder: FormBuilder
  20. ) {
  21.  
  22. }
  23.  
  24. ngOnInit() {
  25. this.idcardForm = this.formBuilder.group({
  26. address: ['502225', [Validators.required, this.addressFormatValidator, this.addressLengthValidator], []],
  27. year: ['1993', [Validators.required, this.yearFormatValidator], []],
  28. month: ['11', [Validators.required, this.monthFormatValidator], []],
  29. day: ['12', [Validators.required, this.dayFormatValidator], []],
  30. sequenceCode: ['123', [Validators.required, this.sequenceCodeValidator], []],
  31. checkCode: ['X', [Validators.required, this.checkCodeValidator], []],
  32. idcard: ['500225199310031919', [Validators.required, this.idcardValidator], []]
  33. });
  34. }
  35.  
  36. onNgSubmit() {
  37. console.log(this.idcardForm.value);
  38. }
  39.  
  40. addressLengthValidator(fc: FormControl): {[key: string]: any} {
  41. let valid = String(fc.value).length === 6;
  42. if (fc.value === null) {
  43. return valid ? null : {addressLengthValidator: { desc : "你填了数据为什么要清除呢?"}};
  44. } else {
  45. return valid ? null : {addressLengthValidator: { desc : "地址码的长度必须为6"}};
  46. }
  47. }
  48. addressFormatValidator(fc: FormControl): {[key: string]: any} {
  49. const value = fc.value;
  50. const addressRegx: RegExp = new RegExp(/^[1-9]\d{5}/);
  51. let valid = addressRegx.test(value);
  52. return valid ? null : {addressFormatValidator: {desc: "地址码长6位,以数字1-9开头,后5位为0-9的数字。"}};
  53. }
  54.  
  55. // TODO:如何将多个验证条件写到一个验证器中去
  56. // addressValidator(fc: FormControl): {[key: string]: any} {
  57. // const value = fc.value;
  58. // const addressRegx: RegExp = new RegExp(/^[1-9]\d{5}/);
  59. // if (String(value).length !== 6) {
  60. // return {addressValidator: {desc: "地址码长6位。"}}
  61. // }
  62. // if (addressRegx.test(value)) {
  63. // return {addressValidator: {desc: "以数字1-9开头,后5位为0-9的数字。"}};
  64. // }
  65.  
  66. // }
  67.  
  68. yearFormatValidator(fc: FormControl): {[key: string]: any} {
  69. const yearRegx: RegExp = new RegExp(/(17|18|19|20)\d{2}/);
  70. const valid = yearRegx.test(fc.value);
  71. if (String(fc.value).length !== 4) {
  72. return {yearFormatValidator: {desc: "年份长度必须是4位"}};
  73. } else {
  74. return valid ? null : {yearFormatValidator: {desc: "年份必须是17、18、19、20作为开头"}};
  75. }
  76. }
  77.  
  78. monthFormatValidator(fc: FormControl): {[key: string]: any} {
  79. const monthRegx: RegExp = new RegExp(/(0[1-9])|(1[0-1])/);
  80. const valid = monthRegx.test(fc.value);
  81. if (String(fc.value).length !== 2) {
  82. return {monthFormatValidator: {desc: "月份长度必须是2位"}};
  83. } else {
  84. return valid ? null : {monthFormatValidator: {desc: "第一位数字为0,第二位数字为1-9;或者第一位数字为1,第二位数字为0-2"}};
  85. }
  86.  
  87. }
  88.  
  89. dayFormatValidator(fc: FormControl): {[key: string]: any} {
  90. const dayRegx: RegExp = new RegExp(/(([0-2][1-9])|10|20|30|31)/);
  91. const valid = dayRegx.test(fc.value);
  92. if (String(fc.value).length !== 2) {
  93. return {dayFormatValidator: {desc: "出生天数的长度必须是2位"}};
  94. } else {
  95. return valid ? null : {dayFormatValidator: {desc: "第一位数字为0-2,第二位数字为1-9;或者是10,20,30,31。"}};
  96. }
  97.  
  98. }
  99.  
  100. sequenceCodeValidator(fc: FormControl): {[key: string]: any} {
  101. const sequenceCodeRegx: RegExp = new RegExp(/\d{3}/);
  102. const valid = sequenceCodeRegx.test(fc.value);
  103. if (String(fc.value).length !== 3) {
  104. return {sequenceCodeValidator: {desc: '顺序码的长度必须是3位'}};
  105. } else {
  106. return valid ? null : {sequenceCodeValidator: {desc: '顺序码是数字'}};
  107. }
  108. }
  109.  
  110. checkCodeValidator(fc: FormControl): {[key: string]: any} {
  111. const checkCodeRegx: RegExp = new RegExp(/[0-9xX]/);
  112. const valid = checkCodeRegx.test(fc.value);
  113. if (String(fc.value).length !== 1) {
  114. return {checkCodeValidator: {desc: '校验码的长度必须是1位'}};
  115. } else {
  116. return valid ? null : {checkCodeValidator: {desc: '校验码自能是数字或者X、x'}};
  117. }
  118. }
  119.  
  120. idcardValidator(fc: FormControl): {[key: string]: any} {
  121. const checkCodeRegx: RegExp = new RegExp(/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/);
  122. const valid = checkCodeRegx.test(fc.value);
  123. if (String(fc.value).length !== 18) {
  124. return {idcardValidator: {desc: '身份证的长度必须是18位'}};
  125. } else {
  126. return valid ? null : {idcardValidator: {desc: '身份证格式错误'}};
  127. }
  128. }
  129.  
  130. }

TS

ES01 数据类型、正则表达式、身份证校验的更多相关文章

  1. Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码正则表达式

    Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年11 ...

  2. Python 身份证校验代码

    Python 身份证校验代码 居民身份证bai编号识别 1.身份证编码规则如下:根据[中华人民共和国国家标准GB11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本 ...

  3. 篇二:JS身份证校验

    身份证校验 function identityCodeValid(code) { var city={11:"北京",12:"天津",13:"河北&q ...

  4. Powerbuilder编写身份证校验码

    public function boolean of_calc_cardid_verifycode (string as_cardid, ref string as_verifycode); /* 计 ...

  5. java实现身份证校验

    原文来自:java教程网 题目:身份证校验   身份证校验   如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以!   因为有人的身份证最后一位是"X"   实 ...

  6. 最严格的身份证校验(JavaScript版)

    在JavaWeb研发过程中为了获取有效的用户信息,校验其数据的有效性非常是必要,以下贴出在项目中用到的关于身份证的校验: <!DOCTYPE HTML PUBLIC "-//W3C// ...

  7. 身份证校验程序(下)- 零基础入门学习Delphi49

    身份证校验程序 让编程改变世界 Change the world by program [caption id="attachment_2699" align="alig ...

  8. 身份证校验程序(上)- 零基础入门学习Delphi48

    身份证校验程序 让编程改变世界 Change the world by program [caption id="attachment_2699" align="alig ...

  9. 完美实现身份证校验 js正则

    注意: 1.只针对18为身份证号码进行校验,现在15位的应该很少了, 2.不区分xX大小写, 3.出生年份1900-2099,每月的天数也进行相关验证(考虑的闰月的情况), 4.校验规则详见,这个写的 ...

随机推荐

  1. MySQL 索引的知识整理

    前言:       很多面试者,在面试的时候,都会回答,”索引就相当于一本书的字典,有了他能够很快的找到数据”, 这种答案好像在读书的时候老师告诉这么说的吧.今天来全面的描述一下数据库索引的原理及优化 ...

  2. javascript常用的数组操作

    数组的定义 var arr=new Array(); var arr=[]; var arr=new Array(10);//定义一个长度为10的数组 数组元素的访问 var temp=arr[1]; ...

  3. InnoDB参数详解

    1.查询5.5版本的InnoDB参数并注释:[root@localhost etc]# grep -i innodb my.cnf; t_innodb; otherwise, slaves may d ...

  4. Balanced Lineup(线段树的简单了解)

    个人心得:线段树就是将一段序列拆分为一个个单独的节点,不过每俩个节点又可以联系在一起,所以就能很好的结合,比如这一题, 每次插入的时候都将这一段区间的最大最小值更新,就能大大减少时间. 这个线段树建立 ...

  5. 试用 Eagle 9.1

    试用 Eagle 9.1 有推挤功能 原理图可以设置组装变体. 输出的 CAM 可以自定义,没有 Protel 那么死板. 保存的文件是 xml 文件,可以自由解析.

  6. 【全面解禁!真正的Expression Blend实战开发技巧】第六章 认识ListBox

    反反复复考虑后,准备把这一章的切入点瞄准ListBox.并用了一个看起来有点别扭的标题“认识ListBox",许多人看到这里就不爱看了,即使是大学里用winform的学生也会说ListBox ...

  7. jenkins 参数化构建和增加环境变量

    1.参数化构建 2.增加环境变量 prepare an environment for the run,需要安装Environment Injector插件

  8. Poj 2421 Constructing Roads(Prim 最小生成树)

    题意:有几个村庄,要修最短的路,使得这几个村庄连通.但是现在已经有了几条路,求在已有路径上还要修至少多长的路. 分析:用Prim求最小生成树,将已有路径的长度置为0,由于0是最小的长度,所以一定会被P ...

  9. Java 字符串和时间互相转化 +时间戳

    一:字符串转换成date String datatime="2015-09-22 15:16:48"; SimpleDateFormat form = new SimpleDate ...

  10. 蓝桥杯 算法训练 ALGO-152 8-2求完数

     算法训练 8-2求完数   时间限制:50.0s   内存限制:256.0MB 问题描述 如果一个自然数的所有小于自身的因子之和等于该数,则称为完数.设计算法,打印1-9999之间的所有完数. 样例 ...