字符串的条件转为为程序检查的条件
-1-100、-100–10、1-200 、> -20 、 , 20 等…
判断一个字符串是否为全数字,代码实现如下
// 判断字符串是否为全数字
bool isPureNumber(const QString &str)
{
// 正则表达式,匹配整数、负数和小数
// 负号只能出现在字符串开头,小数点只能出现一次,且小数点前后都应该有数字(除非它是字符串的最后一个字符)
QRegularExpression rx("^(-?\\d+(\\.\\d+)?)$");
QRegularExpressionMatch match = rx.match(str);
return match.hasMatch();
}
进行特殊条件的校验,代码实现如下
bool checkMatch(QString &condition, QString &valueToCheck)
{
// 正则表达式: 提取字符串中的数字,将非数字的字符去掉,并且保留小数
QRegExp regex("[^\\d.]+");
// 处理 > 运算符
if (condition.startsWith(">"))
{
float condValue = condition.contains("-") ? -condition.replace(regex, "").toFloat() : condition.replace(regex, "").toFloat();
float checkValue = isPureNumber(valueToCheck) ? valueToCheck.replace(regex, "").toFloat() : -valueToCheck.replace(regex, "").toFloat();
return checkValue > condValue;
}
// 处理 < 运算符
else if (condition.startsWith("<"))
{
float condValue = condition.contains("-") ? -condition.replace(regex, "").toFloat() : condition.replace(regex, "").toFloat();
float checkValue = isPureNumber(valueToCheck) ? valueToCheck.replace(regex, "").toFloat() : -valueToCheck.replace(regex, "").toFloat();
return checkValue < condValue;
}
// 处理范围运算
else if (condition.contains("-"))
{
// 处理特殊范围 -1-100、-100--10、1-200 的判断值
if (condition.startsWith("-"))
{
// 开始为“-”:则分割的位置为第二个“-”
int dashIndex = condition.indexOf('-', 1);
QString lowerBound = condition.left(dashIndex);
QString upperBound = condition.mid(dashIndex + 1);
float lCondValue = -lowerBound.replace(regex, "").toFloat(); // 上边界
float uCndValue = upperBound.contains("-") ? -upperBound.replace(regex, "").toFloat() : upperBound.replace(regex, "").toFloat(); // 下边界
float checkValue = isPureNumber(valueToCheck) ? valueToCheck.replace(regex, "").toFloat() : -valueToCheck.replace(regex, "").toFloat();
return checkValue >= lCondValue && checkValue <= uCndValue;
}
else
{
// 开始不为“-”:则分割的位置为第一个“-”
int dashIndex = condition.indexOf('-');
QString lowerBound = condition.left(dashIndex);
QString upperBound = condition.mid(dashIndex + 1);
float lCondValue = lowerBound.replace(regex, "").toFloat(); // 上边界
float uCndValue = upperBound.replace(regex, "").toFloat(); // 下边界 上边界为整数,下边界肯定大于零
float checkValue = isPureNumber(valueToCheck) ? valueToCheck.replace(regex, "").toFloat() : -valueToCheck.replace(regex, "").toFloat();
return checkValue >= lCondValue && checkValue <= uCndValue;
}
}
return false;
}
在校验时,默认条件是符合逻辑的,不会出现非常规的条件