Search code examples
c++string-comparisonversion-numbering

Compare versions as strings


Comparing version numbers as strings is not so easy...
"1.0.0.9" > "1.0.0.10", but it's not correct.
The obvious way to do it properly is to parse these strings, convert to numbers and compare as numbers. Is there another way to do it more "elegantly"? For example, boost::string_algo...


Solution

  • I don't see what could be more elegant than just parsing -- but please make use of standard library facilities already in place. Assuming you don't need error checking:

    void Parse(int result[4], const std::string& input)
    {
        std::istringstream parser(input);
        parser >> result[0];
        for(int idx = 1; idx < 4; idx++)
        {
            parser.get(); //Skip period
            parser >> result[idx];
        }
    }
    
    bool LessThanVersion(const std::string& a,const std::string& b)
    {
        int parsedA[4], parsedB[4];
        Parse(parsedA, a);
        Parse(parsedB, b);
        return std::lexicographical_compare(parsedA, parsedA + 4, parsedB, parsedB + 4);
    }
    

    Anything more complicated is going to be harder to maintain and isn't worth your time.