如何在版本号上使用Javascript数学
我使用jQuery获得如下浏览器版本:如何在版本号上使用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版本(我不需要) 是否有人想出了一种方法来实现将版本号(有多个小数)转换成可以用作评估数字的东西(或者其他方法来完成我在这里试图做的事情) 谢谢-您可以删除所有点,然后将其解析为整数
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;
}