Created
December 18, 2013 12:19
-
-
Save TheDistantSea/8021359 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; | |
} |
Modified version:
https://gist.github.com/em92/d58944f21c68b69433cefb6c49e0defd
- version parts delimeters are "." and "-"
- only-letter version-parts are compared lexicographicaly
- version parts mixed with letters and numbers are separated and compared
- does not return NaN
Another fork:
https://github.com/Rombecchi/version-compare
- added defaults to lexicographical (false) and zeroExtend (true)
- added alpha/beta versioning as valid parts
- empty v1 or v2 param is assumed as version "0"
- version not compared with lex options can accept a single char (ex: "1.10a")
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
another twist on same
https://gist.github.com/prenagha/98bbb03e27163bc2f5e4