Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在版本号上使用Javascript数学_Javascript_Jquery - Fatal编程技术网

如何在版本号上使用Javascript数学

如何在版本号上使用Javascript数学,javascript,jquery,Javascript,Jquery,我使用jQuery获得如下浏览器版本: var x = $.browser.version; 我得到这样的字符串:1.9.1.1 现在,我想做一个评估,如果x>=1.9.1,那么做一些事情。不幸的是,对于多个小数点,我无法执行parseFloat(),因为它将1.9.1.1转换为1.9,并且if求值将匹配1.9.0版本(我不需要) 是否有人想出了一种方法来实现将版本号(有多个小数)转换成可以用作评估数字的东西(或者其他方法来完成我在这里试图做的事情) 谢谢-您可以删除所有点,然后将其解析为整数

我使用jQuery获得如下浏览器版本:

var x = $.browser.version;
我得到这样的字符串:1.9.1.1

现在,我想做一个评估,如果x>=1.9.1,那么做一些事情。不幸的是,对于多个小数点,我无法执行parseFloat(),因为它将1.9.1.1转换为1.9,并且if求值将匹配1.9.0版本(我不需要)

是否有人想出了一种方法来实现将版本号(有多个小数)转换成可以用作评估数字的东西(或者其他方法来完成我在这里试图做的事情)


谢谢-

您可以删除所有点,然后将其解析为整数。
请注意,这种解决方案从长远来看是行不通的。

您可以使用string.split进行一些操作,然后进行逐位比较

// arr[0] = 1
// arr[1] = 9
// arr[2] = 1
// arr[3] = 1
var arr = ($.browser.version).split('.');
以下内容摘自此

这是一个解析版本字符串并返回JSON对象的函数

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
    }
}
然后可以使用以下语法

var version = parseVersionString($.browser.version);
// version.major == 1
// version.minor == 9
// version.build == 1
// version.revision == 1

您需要将字符串的每个部分视为一个单独的整数,因此拆分并迭代,然后执行以下操作:

// perform cmp(a, b)
// -1 = a is smaller
// 0 = equal
// 1 = a is bigger
function versionCmp(a, b) {
  a = a.split(".");
  b = b.split(".");
  for(var i=0; i < a.length; i++) {
    av = parseInt(a[i]);
    bv = parseInt(b[i]);
    if (av < bv) {
      return -1;
    } else if (av > bv) {
      return 1;
    }
  }
  return 0;    
}

console.log(versionCmp("1.1.2.3", "1.2.1.0"));  // should be -1
console.log(versionCmp("1.19.0.1", "1.2.0.4"));  // should be 1
console.log(versionCmp("1.2.3.4", "1.2.3.4"));  // should be 0
//执行cmp(a,b)
//-1=a更小
//0=相等
//1=a更大
函数版本CMP(a,b){
a=a.拆分(“.”);
b=b.拆分(“.”);
对于(变量i=0;ibv){
返回1;
}
}
返回0;
}
log(versionCmp(“1.1.2.3”、“1.2.1.0”);//应该是-1
log(versionCmp(“1.19.0.1”、“1.2.0.4”);//应该是1
log(versionCmp(“1.2.3.4”、“1.2.3.4”);//应该是0

这里是另一个版本的
versionCmp()


这仅在每个数字小于256(因为硬编码除数)且精度有限(即版本字符串不能任意长)的情况下才有效。

已经想到了这一点——不起作用,因为版本可能是2.0(转换为20),但2.0大于1.9.1.1(例如)。build:pat,应该是build:bld,我稍微修改了一下,但效果很好——谢谢!如果版本号的位数不同,则无法正常工作:您必须检查
i
,然后在溢出时将
av
bv
设置为
0
。是的,我本来打算修改它并打包,但Jon的答案已经被接受了;我看不出有什么意义。太好了。一元加号。未充分利用的移位法。但是为什么使用“字符串”?
String()
来转换值;否则,非字符串参数将抛出错误;在cast出现的情况下,您可能会提供像
1.5
这样的数值参数,但仍然会得到一些有意义的结果。我不知道是否就是这样。但是,由于您愿意使用一元加号将字符串转换为数字,因此您可能愿意使用+“”将数字转换为字符串。v1=(v1+).split('.');不是说你应该这样做。使用
+'
会管用,但很难看:显式转换更具可读性,imoI可以对你的一元加号提出同样的论点。:-)
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);
}
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;
}