2010-03-02 5 views
7

Je voudrais déterminer si un numéro de version est supérieur à un autre. Le numéro de version pourrait être une des opérations suivantes:Analyse des numéros de version en nombres réels

4,2

4.22.2

4.2.2.233

... comme le numéro de version est au-delà de mon contrôle, donc je ne pouvais pas dire combien de points pourraient réellement exister dans le nombre.

Comme le nombre est pas vraiment un nombre réel, je ne peux pas dire simplement,

Is 4.7 > 4.2.2 

Comment puis-je aller sur la conversion d'un nombre, par exemple 4.2.2 en un nombre réel qui pourrait être vérifié contre un autre numéro de version? Je préférerais une solution ColdFusion, mais le concept de base serait également bien.

Répondre

6

C'est arraché à partir du code de mise à jour du plugin dans Mango Blog et mis à jour un peu. Cela devrait faire exactement ce que vous voulez. Il renvoie 1 lorsque l'argument 1 est supérieur, -1 lorsque l'argument 2 est supérieur et 0 lorsqu'il s'agit de correspondances exactes. (Notez que 4.0.1 sera une correspondance exacte avec 4.0.1.0)

Il utilise les fonctions de liste CF, au lieu de tableaux, de sorte que vous pourriez voir une petite augmentation des performances si vous passiez à des tableaux à la place ... mais bon , Ça marche!

function versionCompare(version1, version2){ 
    var len1 = listLen(arguments.version1, '.'); 
    var len2 = listLen(arguments.version2, '.'); 
    var i = 0; 
    var piece1 = ''; 
    var piece2 = ''; 

    if (len1 gt len2){ 
     arguments.version2 = arguments.version2 & repeatString('.0', len1-len2); 
    }else if (len2 gt len1){ 
     arguments.version1 = arguments.version1 & repeatString('.0', len2-len1); 
    } 

    for (i=1; i lte listLen(arguments.version1, '.'); i=i+1){ 
     piece1 = listGetAt(arguments.version1, i, '.'); 
     piece2 = listGetAt(arguments.version2, i, '.'); 

     if (piece1 neq piece2){ 
      if (piece1 gt piece2){ 
       return 1; 
      }else{ 
       return -1; 
      } 
     } 
    } 

    //equal 
    return 0; 
} 

Exécution de votre test exemple:

<cfoutput>#versionCompare('4.7', '4.2.2')#</cfoutput> 

impressions:

1

Analyser chaque nombre séparément et les comparer de manière itérative.

if (majorVersion > 4 && 
    minorVersion > 2 && 
    revision > 2) 
{ 
    // do something useful 
} 

// fail here 

Ce n'est évidemment pas du code CF, mais vous avez l'idée.

+0

En fait, c'est: D C'est CFScript (CF8 + ou BD/Railo) parfaitement valide. :) –

0

Vous pouvez diviser la chaîne contenant la version par périodes, puis commencer au premier index et comparer jusqu'à ce que l'un soit supérieur à l'autre (ou s'ils sont égaux, l'un contient une valeur que l'autre n'a pas). J'ai peur de ne jamais avoir écrit en coldfusion, mais ce serait la logique de base que je suivrais.

Ceci est un exemple unoptimized rude:

bool IsGreater(string one, string two) 
{ 
    int count; 
    string[] v1; 
    string[] v2; 

    v1 = one.Split("."); 
    v2 = two.Split("."); 

    count = (one.Length > two.Length) ? one.Length : two.Length; 

    for (int x=0;x<count;x++) 
    { 
    if (Convert.ToInt32(v1[x]) < Convert.ToInt32(v2[x])) 
     return false; 
    else if (Convert.ToInt32(v1[x]) > Convert.ToInt32(v2[x]) 
     return true; 
    } // If they are the same it'll go to the next block. 

    // If you're here, they both were equal for the shortest version's digit count. 
    if (v1.Length > v2.Length) 
    return true; // The first one has additional subversions so it's greater. 
} 
1

Un numéro de version est essentiellement un tableau délimité par période de nombres, vous pouvez analyser les deux versions dans des tableaux numériques, puis comparer chaque élément dans le premier tableau à l'élément correspondant dans le second tableau.

obtenir le tableau, faites:

<cfset theArrayofNumbers = listToArray(yourVersionString, ".")> 

et vous pouvez faire vos comparaisons.

0

Il n'existe aucun moyen général de convertir des numéros de version en plusieurs parties en nombres réels, s'il n'y a aucune restriction sur la taille de chaque partie (par exemple, 4.702.0> 4.7.2?).

Normalement, on définit une fonction de comparaison personnalisée par la création d'une séquence ou d'un tableau de numéro-version parties ou composants, de sorte que 4.7.2 est représenté par [4, 7, 2] et 4.702.0 est [ 4, 702, 0]. Ensuite, vous comparez chaque élément des deux tableaux jusqu'à ce qu'ils ne correspondent pas:

left = [4, 7, 2] 
right = [4, 702, 0] 

# check index 0 
# left[0] == 4, right[0] == 4 
left[0] == right[0] 
# equal so far 

# check index 1 
# left[1] == 7, right[1] == 702 
left[1] < right[1] 
# so left < right 

Je ne sais pas ColdFusion, mais dans certaines langues, vous pouvez faire une comparaison directe avec des tableaux ou des séquences.Par exemple, en Python:

>>> left = [4, 7, 2] 
>>> right = [4, 702, 0] 
>>> left < right 
True 
3

Si la version 4 signifie réellement 4.0.0 et la version 4.2 signifie réellement 4.2. 0, vous pouvez facilement convertir la version en un entier simple.

suppose que chaque partie de la version est comprise entre 0 et 99, alors vous pouvez calculer un version « entier » de XYZ comme ceci:

Version = X*100*100 + Y*100 + Z 

Si les plages sont plus ou moins important, vous pouvez utiliser des facteurs plus ou inférieur à 100.

La comparaison de la version devient alors facile.

+1

En général, ce n'est pas une mauvaise idée, mais il a spécifiquement dit, "le numéro de version est hors de mon contrôle", ce qui signifie que le numéro de version pourrait être 2.454359043859043.6, ce qui échouerait votre approche. –

Questions connexes