个人技术分享

字符串的条件转为为程序检查的条件

-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;
}

在校验时,默认条件是符合逻辑的,不会出现非常规的条件