校验数据的正确性
import javax.script.ScriptEngineManager
object ValueValidationUtil {
fun isInTheInterval(data: String, interval: String): Boolean {
val formula = getFormulaByAllInterval(data, interval, "||")
val jse = ScriptEngineManager().getEngineByName("JavaScript")
return try {
jse.eval(formula) as Boolean
} catch (t: Exception) {
false
}
}
private fun getFormulaByAllInterval(date: String, interval: String, connector: String): String {
val buff = StringBuilder()
for (limit in interval.split("U").toTypedArray()) {
buff.append("(").append(getFormulaByInterval(date, limit, " && ")).append(")").append(connector)
}
var allLimitInterval = buff.toString()
val index = allLimitInterval.lastIndexOf(connector)
allLimitInterval = allLimitInterval.substring(0, index)
return allLimitInterval
}
private fun getFormulaByInterval(date: String, interval: String, connector: String): String {
val buff = StringBuilder()
for (halfInterval in interval.split(",").toTypedArray()) {
buff.append(getFormulaByHalfInterval(halfInterval, date)).append(connector)
}
var limitInterval = buff.toString()
val index = limitInterval.lastIndexOf(connector)
limitInterval = limitInterval.substring(0, index)
return limitInterval
}
private fun getFormulaByHalfInterval(halfInterval: String, dateValue: String): String {
val half = halfInterval.trim()
if (half.contains("∞")) {
return "1 == 1"
}
val formula = StringBuffer()
val data: String
val opera: String
if (half.matches(Regex("^([<>≤≥\\[(]{1}(-?\\d+\\.?\\d*%?))$"))) {
opera = half.substring(0, 1)
data = half.substring(1)
} else {
opera = half.substring(half.length - 1)
data = half.substring(0, half.length - 1)
}
val value = dealPercent(data)
formula.append(dateValue).append(" ").append(opera).append(" ").append(value)
val a = formula.toString()
return a.replace("[", ">=").replace("(", ">").replace("]", "<=")
.replace(")", "<").replace("≤", "<=").replace("≥", ">=")
}
private fun dealPercent(str: String): Double {
val d = if (str.contains("%")) {
str.substring(0, str.length - 1).toDouble() / 100
} else {
str.toDouble()
}
return d
}
}