-
-
Save pc035860/ccb58a02f5085db0c97d to your computer and use it in GitHub Desktop.
Function to compare two version strings (e.g. "1.6.1" is smaller than "1.7"). Developed in order to answer http://stackoverflow.com/a/6832721/50079.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Compares two software version numbers (e.g. "1.7.1" or "1.2b"). | |
* | |
* This function was born in http://stackoverflow.com/a/6832721. | |
* | |
* @param {string} v1 The first version to be compared. | |
* @param {string} v2 The second version to be compared. | |
* @param {object} [options] Optional flags that affect comparison behavior: | |
* <ul> | |
* <li> | |
* <tt>lexicographical: true</tt> compares each part of the version strings lexicographically instead of | |
* naturally; this allows suffixes such as "b" or "dev" but will cause "1.10" to be considered smaller than | |
* "1.2". | |
* </li> | |
* <li> | |
* <tt>zeroExtend: true</tt> changes the result if one version string has less parts than the other. In | |
* this case the shorter string will be padded with "zero" parts instead of being considered smaller. | |
* </li> | |
* </ul> | |
* @returns {number|NaN} | |
* <ul> | |
* <li>0 if the versions are equal</li> | |
* <li>a negative integer iff v1 < v2</li> | |
* <li>a positive integer iff v1 > v2</li> | |
* <li>NaN if either version string is in the wrong format</li> | |
* </ul> | |
* | |
* @copyright by Jon Papaioannou (["john", "papaioannou"].join(".") + "@gmail.com") | |
* @license This function is in the public domain. Do what you want with it, no strings attached. | |
*/ | |
function versionCompare(v1, v2, options) { | |
var lexicographical = options && options.lexicographical, | |
zeroExtend = options && options.zeroExtend, | |
v1parts = v1.split('.'), | |
v2parts = v2.split('.'); | |
function isValidPart(x) { | |
return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x); | |
} | |
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) { | |
return NaN; | |
} | |
if (zeroExtend) { | |
while (v1parts.length < v2parts.length) v1parts.push("0"); | |
while (v2parts.length < v1parts.length) v2parts.push("0"); | |
} | |
if (!lexicographical) { | |
v1parts = v1parts.map(Number); | |
v2parts = v2parts.map(Number); | |
} | |
for (var i = 0; i < v1parts.length; ++i) { | |
if (v2parts.length == i) { | |
return 1; | |
} | |
if (v1parts[i] == v2parts[i]) { | |
continue; | |
} | |
else if (v1parts[i] > v2parts[i]) { | |
return 1; | |
} | |
else { | |
return -1; | |
} | |
} | |
if (v1parts.length != v2parts.length) { | |
return -1; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment