toolsValidate.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /**
  2. * 2020.11.29 lyt 整理
  3. * 工具类集合,适用于平时开发
  4. * 新增多行注释信息,鼠标放到方法名即可查看
  5. */
  6. /**
  7. * 验证百分比(不可以小数)
  8. * @param val 当前值字符串
  9. * @returns 返回处理后的字符串
  10. */
  11. export function verifyNumberPercentage(val: string): string {
  12. // 匹配空格
  13. let v = val.replace(/(^\s*)|(\s*$)/g, '');
  14. // 只能是数字和小数点,不能是其他输入
  15. v = v.replace(/[^\d]/g, '');
  16. // 不能以0开始
  17. v = v.replace(/^0/g, '');
  18. // 数字超过100,赋值成最大值100
  19. v = v.replace(/^[1-9]\d\d{1,3}$/, '100');
  20. // 返回结果
  21. return v;
  22. }
  23. /**
  24. * 验证百分比(可以小数)
  25. * @param val 当前值字符串
  26. * @returns 返回处理后的字符串
  27. */
  28. export function verifyNumberPercentageFloat(val: string): string {
  29. let v = verifyNumberIntegerAndFloat(val);
  30. // 数字超过100,赋值成最大值100
  31. v = v.replace(/^[1-9]\d\d{1,3}$/, '100');
  32. // 超过100之后不给再输入值
  33. v = v.replace(/^100\.$/, '100');
  34. // 返回结果
  35. return v;
  36. }
  37. /**
  38. * 小数或整数(不可以负数)
  39. * @param val 当前值字符串
  40. * @returns 返回处理后的字符串
  41. */
  42. export function verifyNumberIntegerAndFloat(val: string) {
  43. // 匹配空格
  44. let v = val.replace(/(^\s*)|(\s*$)/g, '');
  45. // 只能是数字和小数点,不能是其他输入
  46. v = v.replace(/[^\d.]/g, '');
  47. // 以0开始只能输入一个
  48. v = v.replace(/^0{2}$/g, '0');
  49. // 保证第一位只能是数字,不能是点
  50. v = v.replace(/^\./g, '');
  51. // 小数只能出现1位
  52. v = v.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
  53. // 小数点后面保留2位
  54. v = v.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
  55. // 返回结果
  56. return v;
  57. }
  58. /**
  59. * 正整数验证
  60. * @param val 当前值字符串
  61. * @returns 返回处理后的字符串
  62. */
  63. export function verifiyNumberInteger(val: string) {
  64. // 匹配空格
  65. let v = val.replace(/(^\s*)|(\s*$)/g, '');
  66. // 去掉 '.' , 防止贴贴的时候出现问题 如 0.1.12.12
  67. v = v.replace(/[\.]*/g, '');
  68. // 去掉以 0 开始后面的数, 防止贴贴的时候出现问题 如 00121323
  69. v = v.replace(/(^0[\d]*)$/g, '0');
  70. // 首位是0,只能出现一次
  71. v = v.replace(/^0\d$/g, '0');
  72. // 只匹配数字
  73. v = v.replace(/[^\d]/g, '');
  74. // 返回结果
  75. return v;
  76. }
  77. /**
  78. * 去掉中文及空格
  79. * @param val 当前值字符串
  80. * @returns 返回处理后的字符串
  81. */
  82. export function verifyCnAndSpace(val: string) {
  83. // 匹配中文与空格
  84. let v = val.replace(/[\u4e00-\u9fa5\s]+/g, '');
  85. // 匹配空格
  86. v = v.replace(/(^\s*)|(\s*$)/g, '');
  87. // 返回结果
  88. return v;
  89. }
  90. /**
  91. * 去掉英文及空格
  92. * @param val 当前值字符串
  93. * @returns 返回处理后的字符串
  94. */
  95. export function verifyEnAndSpace(val: string) {
  96. // 匹配英文与空格
  97. let v = val.replace(/[a-zA-Z]+/g, '');
  98. // 匹配空格
  99. v = v.replace(/(^\s*)|(\s*$)/g, '');
  100. // 返回结果
  101. return v;
  102. }
  103. /**
  104. * 禁止输入空格
  105. * @param val 当前值字符串
  106. * @returns 返回处理后的字符串
  107. */
  108. export function verifyAndSpace(val: string) {
  109. // 匹配空格
  110. let v = val.replace(/(^\s*)|(\s*$)/g, '');
  111. // 返回结果
  112. return v;
  113. }
  114. /**
  115. * 金额用 `,` 区分开
  116. * @param val 当前值字符串
  117. * @returns 返回处理后的字符串
  118. */
  119. export function verifyNumberComma(val: string) {
  120. // 调用小数或整数(不可以负数)方法
  121. let v: any = verifyNumberIntegerAndFloat(val);
  122. // 字符串转成数组
  123. v = v.toString().split('.');
  124. // \B 匹配非单词边界,两边都是单词字符或者两边都是非单词字符
  125. v[0] = v[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  126. // 数组转字符串
  127. v = v.join('.');
  128. // 返回结果
  129. return v;
  130. }
  131. /**
  132. * 匹配文字变色(搜索时)
  133. * @param val 当前值字符串
  134. * @param text 要处理的字符串值
  135. * @param color 搜索到时字体高亮颜色
  136. * @returns 返回处理后的字符串
  137. */
  138. export function verifyTextColor(val: string, text = '', color = 'red') {
  139. // 返回内容,添加颜色
  140. let v = text.replace(new RegExp(val, 'gi'), `<span style='color: ${color}'>${val}</span>`);
  141. // 返回结果
  142. return v;
  143. }
  144. /**
  145. * 数字转中文大写
  146. * @param val 当前值字符串
  147. * @param unit 默认:仟佰拾亿仟佰拾万仟佰拾元角分
  148. * @returns 返回处理后的字符串
  149. */
  150. export function verifyNumberCnUppercase(val: any, unit = '仟佰拾亿仟佰拾万仟佰拾元角分', v = '') {
  151. // 当前内容字符串添加 2个0,为什么??
  152. val += '00';
  153. // 返回某个指定的字符串值在字符串中首次出现的位置,没有出现,则该方法返回 -1
  154. let lookup = val.indexOf('.');
  155. // substring:不包含结束下标内容,substr:包含结束下标内容
  156. if (lookup >= 0) val = val.substring(0, lookup) + val.substr(lookup + 1, 2);
  157. // 根据内容 val 的长度,截取返回对应大写
  158. unit = unit.substr(unit.length - val.length);
  159. // 循环截取拼接大写
  160. for (let i = 0; i < val.length; i++) {
  161. v += '零壹贰叁肆伍陆柒捌玖'.substr(val.substr(i, 1), 1) + unit.substr(i, 1);
  162. }
  163. // 正则处理
  164. v = v
  165. .replace(/零角零分$/, '整')
  166. .replace(/零[仟佰拾]/g, '零')
  167. .replace(/零{2,}/g, '零')
  168. .replace(/零([亿|万])/g, '$1')
  169. .replace(/零+元/, '元')
  170. .replace(/亿零{0,3}万/, '亿')
  171. .replace(/^元/, '零元');
  172. // 返回结果
  173. return v;
  174. }
  175. /**
  176. * 手机号码
  177. * @param val 当前值字符串
  178. * @returns 返回 true: 手机号码正确
  179. */
  180. export function verifyPhone(val: string) {
  181. // false: 手机号码不正确
  182. if (!/^1[3456789][0-9]{9}$/.test(val)) return false;
  183. // true: 手机号码正确
  184. else return true;
  185. }
  186. /**
  187. * 国内电话号码
  188. * @param val 当前值字符串
  189. * @returns 返回 true: 国内电话号码正确
  190. */
  191. export function verifyTelPhone(val: string) {
  192. // false: 国内电话号码不正确
  193. if (!/\d{3}-\d{8}|\d{4}-\d{7}/.test(val)) return false;
  194. // true: 国内电话号码正确
  195. else return true;
  196. }
  197. /**
  198. * 登录账号 (字母开头,允许5-16字节,允许字母数字下划线)
  199. * @param val 当前值字符串
  200. * @returns 返回 true: 登录账号正确
  201. */
  202. export function verifyAccount(val: string) {
  203. // false: 登录账号不正确
  204. if (!/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/.test(val)) return false;
  205. // true: 登录账号正确
  206. else return true;
  207. }
  208. /**
  209. * 密码 (以字母开头,长度在6~16之间,只能包含字母、数字和下划线)
  210. * @param val 当前值字符串
  211. * @returns 返回 true: 密码正确
  212. */
  213. export function verifyPassword(val: string) {
  214. // false: 密码不正确
  215. if (!/^[a-zA-Z]\w{5,15}$/.test(val)) return false;
  216. // true: 密码正确
  217. else return true;
  218. }
  219. /**
  220. * 强密码 (字母+数字+特殊字符,长度在6-16之间)
  221. * @param val 当前值字符串
  222. * @returns 返回 true: 强密码正确
  223. */
  224. export function verifyPasswordPowerful(val: string) {
  225. // false: 强密码不正确
  226. if (!/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val)) return false;
  227. // true: 强密码正确
  228. else return true;
  229. }
  230. /**
  231. * 密码强度
  232. * @param val 当前值字符串
  233. * @description 弱:纯数字,纯字母,纯特殊字符
  234. * @description 中:字母+数字,字母+特殊字符,数字+特殊字符
  235. * @description 强:字母+数字+特殊字符
  236. * @returns 返回处理后的字符串:弱、中、强
  237. */
  238. export function verifyPasswordStrength(val: string) {
  239. let v = '';
  240. // 弱:纯数字,纯字母,纯特殊字符
  241. if (/^(?:\d+|[a-zA-Z]+|[!@#$%^&\.*]+){6,16}$/.test(val)) v = '弱';
  242. // 中:字母+数字,字母+特殊字符,数字+特殊字符
  243. if (/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val)) v = '中';
  244. // 强:字母+数字+特殊字符
  245. if (/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val)) v = '强';
  246. // 返回结果
  247. return v;
  248. }
  249. /**
  250. * IP地址
  251. * @param val 当前值字符串
  252. * @returns 返回 true: IP地址正确
  253. */
  254. export function verifyIPAddress(val: string) {
  255. // false: IP地址不正确
  256. if (!/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(val)) return false;
  257. // true: IP地址正确
  258. else return true;
  259. }
  260. /**
  261. * 邮箱
  262. * @param val 当前值字符串
  263. * @returns 返回 true: 邮箱正确
  264. */
  265. export function verifyEmail(val: string) {
  266. // false: 邮箱不正确
  267. if (!/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(val)) return false;
  268. // true: 邮箱正确
  269. else return true;
  270. }
  271. /**
  272. * 身份证
  273. * @param val 当前值字符串
  274. * @returns 返回 true: 身份证正确
  275. */
  276. export function verifyIdCard(val: string) {
  277. // false: 身份证不正确
  278. if (!/^[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]$/.test(val)) return false;
  279. // true: 身份证正确
  280. else return true;
  281. }
  282. /**
  283. * 姓名
  284. * @param val 当前值字符串
  285. * @returns 返回 true: 姓名正确
  286. */
  287. export function verifyFullName(val: string) {
  288. // false: 姓名不正确
  289. if (!/^[\u4e00-\u9fa5]{1,6}(·[\u4e00-\u9fa5]{1,6}){0,2}$/.test(val)) return false;
  290. // true: 姓名正确
  291. else return true;
  292. }
  293. /**
  294. * 邮政编码
  295. * @param val 当前值字符串
  296. * @returns 返回 true: 邮政编码正确
  297. */
  298. export function verifyPostalCode(val: string) {
  299. // false: 邮政编码不正确
  300. if (!/^[1-9][0-9]{5}$/.test(val)) return false;
  301. // true: 邮政编码正确
  302. else return true;
  303. }
  304. /**
  305. * url 处理
  306. * @param val 当前值字符串
  307. * @returns 返回 true: url 正确
  308. */
  309. export function verifyUrl(val: string) {
  310. // false: url不正确
  311. if (
  312. !/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(
  313. val
  314. )
  315. )
  316. return false;
  317. // true: url正确
  318. else return true;
  319. }
  320. /**
  321. * 车牌号
  322. * @param val 当前值字符串
  323. * @returns 返回 true:车牌号正确
  324. */
  325. export function verifyCarNum(val: string) {
  326. // false: 车牌号不正确
  327. if (
  328. !/^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(
  329. val
  330. )
  331. )
  332. return false;
  333. // true:车牌号正确
  334. else return true;
  335. }
  336. /**
  337. * 解析身份证
  338. */
  339. export function judgementIdCard(idCard: string) {
  340. let entity = {} as any;
  341. let currentDate = new Date();
  342. let yearNow = currentDate.getFullYear();
  343. let birthDateCode = idCard.substring(6, 14);
  344. let genderCode = parseInt(idCard.substring(16, 17), 10);
  345. entity.sex = genderCode % 2 === 0 ? 2 : 1;
  346. entity.age = yearNow - parseInt(birthDateCode.substring(0, 4));
  347. entity.birthday = `${birthDateCode.substring(0, 4)}-${birthDateCode.substring(4, 6)}-${birthDateCode.substring(6, 8)}`;
  348. return entity;
  349. }