Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Javascript math on a version number

I use jQuery to get the browser version like this:

var x = $.browser.version;

I get a string like this: 1.9.1.1

Now, I want to do an evaluation so if x is >= 1.9.1 then do some stuff. Unfortunately, with multiple decimal points, I cannot do a parseFloat() because it converts 1.9.1.1 to simply 1.9, and the if evaluation would match a 1.9.0 version (which I do not want).

Has someone figured out a way to accomplish turning a version number (with multiple decimals) into something that can be used as a number for evaluation (or some other way to accomplish what I am trying to do here)?

Thanks -

like image 761
OneNerd Avatar asked Sep 09 '26 08:09

OneNerd


2 Answers

You could do something with string.split and then do a digit by digit comparison

// arr[0] = 1
// arr[1] = 9
// arr[2] = 1
// arr[3] = 1
var arr = ($.browser.version).split('.');

The following is taken from this post

This is a function that will parse your version string and give you back a JSON object

function parseVersionString (str) {
    if (typeof(str) != 'string') { return false; }
    var x = str.split('.');

    // parse from string or default to 0 if can't parse 
    var maj = parseInt(x[0]) || 0;
    var min = parseInt(x[1]) || 0;
    var bld = parseInt(x[2]) || 0;
    var rev = parseInt(x[3]) || 0;
    return {
        major: maj,
        minor: min,
        build: bld,
        revision: rev
    }
}

Then you could use the following syntax

var version = parseVersionString($.browser.version);
// version.major == 1
// version.minor == 9
// version.build == 1
// version.revision == 1
like image 73
Jon Erickson Avatar answered Sep 11 '26 22:09

Jon Erickson


Here's another version of versionCmp():

function versionCmp(v1, v2) {
    v1 = String(v1).split('.');
    v2 = String(v2).split('.');

    var diff = 0;
    while((v1.length || v2.length) && !diff)
        diff = (+v1.shift() || 0) - (+v2.shift() || 0);

    return (diff > 0) - (diff < 0);
}

Another possibility would be to assign a numeric value to each version number:

function valueOfVersion(ver) {
    ver = String(ver).split('.');

    var value = 0;
    for(var i = ver.length; i--;)
        value += ver[i] / Math.pow(2, i * 8) || 0;

    return value;
}

This only works if each digit is less than 256 (because of the hard-coded divisor) and has a limited precision (ie the version strings can't get arbitrarily long).

like image 21
Christoph Avatar answered Sep 11 '26 20:09

Christoph



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!