/** 文本表示的数字取值范围,比如 : "2,3,5-8" 表示 * () => 大于等于 小于等于 * [] => 大于 小于 */ export class MaskedNumberRange { maskedNumbers: any[] constructor(strRs: string) { let rs = [] let strs = strRs.split(',') for (let str of strs) { if (str.trim() == '') continue let n = Number(str) let s_flag = 'in' let e_flag = 'in' if (!Number.isNaN(n)) { rs.push({ s: n, e: n, s_flag, e_flag }) } else { let zys = str.split('-') if (zys.length != 2) continue if (zys[0].trim() == '' || zys[1].trim() == '') continue let start :any = zys[0] let end :any = zys[1] if (zys[0].trim().includes('(')) { s_flag = 'notIn' start = start.replaceAll('(', '') } else if (zys[0].trim().includes('[')) { s_flag = 'in' start = start.replaceAll('[', '') } if (start == 'x') { s_flag = 'infinite' }else{ start = Number(start) } if (zys[1].trim().includes(')')) { e_flag = 'notIn' end = end.replaceAll(')', '') } else if (zys[1].trim().includes(']')) { e_flag = 'in' end = end.replaceAll(']', '') } if (end == 'x') { e_flag = 'infinite' }else{ end = Number(end) } let s = start // Number(zys[0]) let e = end //Number(zys[1]) rs.push({ s: s, e: e, s_flag, e_flag }) } } this.maskedNumbers = rs } /** 参数是否在给定范围内 */ isInRange(r: number): boolean { let res = false for (let se of this.maskedNumbers) { if (se.s_flag == 'infinite') { // 无穷 不判断 res = true } else if (se.s_flag == 'notIn') { if (r > se.s) { res = true } } else if (se.s_flag == 'in') { if (r >= se.s) { res = true } } if (res == true) { let res1 = false if (se.e_flag == 'infinite') { res1 = true } else if (se.e_flag == 'notIn') { if (r < se.e) { res1 = true } } else if (se.e_flag == 'in') { if (r <= se.e) { res1 = true } } res = res && res1 } if(res == true){ return true } // if (r > se.s && r < se.e) // return true } return res } }