119 lines
2.5 KiB
TypeScript
119 lines
2.5 KiB
TypeScript
/** 文本表示的数字取值范围,比如 : "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
|
|
}
|
|
}
|