2009-07-18 6 views
3

J'utilise jQuery pour obtenir la version du navigateur comme ceci:Comment utiliser les mathématiques Javascript sur un numéro de version

var x = $.browser.version; 

Je reçois une chaîne comme ceci: 1.9.1.1

Maintenant, je veux faire une évaluation, donc si x est> = 1.9.1 alors faites quelques trucs. Malheureusement, avec plusieurs points décimaux, je ne peux pas faire un parseFloat() car il convertit 1.9.1.1 en simplement 1.9, et l'évaluation if correspondrait à une version 1.9.0 (que je ne veux pas). Est-ce que quelqu'un a trouvé un moyen de transformer un numéro de version (avec plusieurs décimales) en quelque chose qui peut être utilisé comme un nombre pour l'évaluation (ou une autre façon d'accomplir ce que j'essaie de faire ici)?

Merci -

Répondre

7

Vous pouvez faire quelque chose avec string.split puis faire un chiffre par comparaison de chiffres

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

Ce qui suit est tiré de ce post

Ceci est une fonction qui analysera votre chaîne de version et de donner vous sauvegardez un objet 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 
    } 
} 

Ensuite, vous pouvez utiliser la syntaxe suivante

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

le build: pat, devrait être build: bld, et j'ai légèrement modifié pour mon usage, mais a bien fonctionné - merci! – OneNerd

-3

Vous pouvez supprimer tous les points, puis l'analyser comme un entier. Prenez note que cette solution ne fonctionne pas à long terme.

+0

1.9.10! = 1.9.1.0 –

+0

Déjà pensé à cela - ne fonctionnera pas depuis la version peut être 2.0 (convertit en 20), mais 2.0 est supérieur à 1.9.1.1 (par exemple). – OneNerd

0

Vous devez traiter chaque partie de la chaîne comme séparée entier, alors divisé et itérer et cmp:

// 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 
+0

ne fonctionne pas correctement si les numéros de version diffèrent par le nombre de chiffres: vous devrez vérifier 'i Christoph

+0

Ouais, j'allais le réviser et faire l'emballage que vous avez fait, mais la réponse de Jon avait déjà été acceptée d'ici là; Je n'ai pas vu grand-chose. –

1

Voici une autre version de 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); 
} 

Une autre possibilité serait d'attribuer une valeur numérique à chaque numéro de version:

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; 
} 

Cela ne fonctionne que si chaque chiffre est inférieur à 256 (à cause du diviseur codé en dur) et a une précision limitée (ie les chaînes de version ne peuvent pas être arbitrairement longues).

+0

Excellent. Unaire plus. Méthode de décalage sous-utilisé. Mais pourquoi "String"? – Nosredna

+0

'String()' est utilisé pour convertir les valeurs; sinon, une erreur serait renvoyée pour les arguments non-chaîne; avec le cast présent, vous pouvez par exemple fournir des arguments numériques comme '1.5' et obtenir encore des résultats quelque peu significatifs – Christoph

+0

Je me demandais si c'était ça.Mais puisque vous êtes prêt à faire un plus unaire pour convertir une chaîne en nombre, vous pouvez utiliser + "" pour convertir un nombre en chaîne. v1 = (v1 + ""). split ('.'); Ne pas dire que vous devriez. – Nosredna

Questions connexes