2010-03-02 5 views
7

Ich möchte feststellen, ob eine Versionsnummer größer als eine andere ist. Die Versionsnummer kann eine der folgenden sein:Parsing Versionsnummern zu reellen Zahlen

4,2

4.22.2

4.2.2.233

... als die Versionsnummer außerhalb meiner Kontrolle, also konnte ich nicht sagen, wie viele Punkte tatsächlich in der Zahl existieren könnten.

Da die Zahl nicht wirklich eine reelle Zahl ist, kann ich nicht einfach sagen:

Is 4.7 > 4.2.2 

Wie kann ich mich über eine Reihe, wie zum Beispiel 4.2.2 in eine reelle Zahl umgewandelt werden, die überprüft werden konnten gegen eine andere Versionsnummer?

Ich würde gerne eine ColdFusion-Lösung, aber das Grundkonzept wäre auch in Ordnung.

Antwort

6

Dies wird aus dem Plugin-Update-Code in Mango Blog reißt, und aktualisierte ein wenig. Es sollte genau das tun, was du willst. Sie gibt 1 zurück, wenn Argument 1 größer ist, -1, wenn Argument 2 größer ist, und 0, wenn es sich um exakte Übereinstimmungen handelt. (Beachten Sie, dass 4.0.1 eine exakte Übereinstimmung mit 4.0.1.0 ist)

Es verwendet die CF-Liste Funktionen, anstatt Arrays, so dass Sie eine kleine Leistungssteigerung sehen können, wenn Sie stattdessen zu Arrays wechselte ... aber hey , Es klappt!

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

Betrieb Ihres Beispiel-Test:

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

druckt:

1

Analysieren Sie jede Zahl einzeln und vergleichen Sie sie iterativ.

Das ist natürlich nicht CF-Code, aber Sie bekommen die Idee.

+0

Eigentlich ist es: D Das ist perfekt CFScript (CF8 + oder BD/Railo) genau dort. :) –

0

Sie können die Zeichenfolge, die die Version enthält, durch Punkte teilen, dann beim ersten Index beginnen und vergleichen, bis einer größer ist als der andere (oder wenn sie gleich sind, enthält einer den Wert, der andere nicht).

Ich fürchte, ich habe nie in Coldfusion geschrieben, aber das wäre die grundlegende Logik, der ich folgen würde.

Dies ist ein grobes nicht optimierten Beispiel: im Grunde eine Periode begrenzt Array von Zahlen

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

Eine Versionsnummer ist, so dass man beiden Versionen in Anzahl Arrays analysieren kann, und dann jedes Element in dem ersten Array vergleichen, um das entsprechende Element im zweiten Array.

das Array zu erhalten, tun:

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

und dann können Sie Ihre Vergleiche tun.

0

Es gibt keine allgemeine Möglichkeit, mehrteilige Versionsnummern in reelle Zahlen umzuwandeln, wenn die Größe der einzelnen Teile nicht beschränkt ist (z. B. 4.702.0> 4.7.2?).

Normalerweise würde man eine benutzerdefinierte Vergleichsfunktion definieren, durch eine Sequenz oder ein Array von Versionsnummer Erstellen Teile oder Komponenten, so 4.7.2 wird dargestellt als [4, 7, 2] und 4.702.0 ist [ 4, 702, 0]. Dann vergleichen Sie jedes Element der beiden Arrays, bis sie nicht übereinstimmen:

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 

Ich weiß nicht, über Coldfusion, aber in einigen Sprachen können Sie einen direkten Vergleich mit Arrays oder Sequenzen tun.Zum Beispiel in Python:

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

Wenn Version 4 tatsächlich bedeutet, 4.0.0 und Version 4.2 bedeutet eigentlich 4.2. 0, könnten Sie die Version einfach in eine einfache Ganzzahl konvertieren.

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

Wenn die Bereiche größer oder kleiner sind Sie Faktoren höher verwenden:

nehme an, dass jeder Teil der Version zwischen 0 und 99 ist, dann könnte man eine ‚integer Version‘ von XYZ wie folgt berechnen oder niedriger als 100.

Vergleichen der Version wird dann einfach.

+1

Im Allgemeinen ist das keine schlechte Idee, aber er sagte ausdrücklich, "die Versionsnummer ist außerhalb meiner Kontrolle", was bedeutet, dass die Versionsnummer 2.454359043859043.6 sein könnte, mit der Ihr Ansatz scheitern würde. –