2010-03-02 25 views
7

Me gustaría determinar si un número de versión es mayor que otro. El número de versión podría ser cualquiera de los siguientes:Números de versión de análisis a números reales

4,2

4.22.2

4.2.2.233

... como el número de versión es fuera de mi control, así que no podría decir cuántos puntos podrían existir realmente en el número.

Dado que el número no es un número real, no puedo simplemente decir,

Is 4.7 > 4.2.2 

¿Cómo puedo ir sobre la conversión de un número, como por ejemplo 4.2.2 en un número real que podrían ser verificado contra otro número de versión?

Preferiría una solución ColdFusion, pero el concepto básico también estaría bien.

Respuesta

6

Esta es arrancado de la actualización del plugin de código en Mango Blog, y actualizado un poco. Debería hacer exactamente lo que quieres. Devuelve 1 cuando el argumento 1 es mayor, -1 cuando el argumento 2 es mayor y 0 cuando son coincidencias exactas. (Tenga en cuenta que 4.0.1 será una coincidencia exacta con 4.0.1.0)

Utiliza las funciones de la lista CF, en lugar de matrices, por lo que es posible que vea un pequeño aumento en el rendimiento si cambió a las matrices ... pero oye , ¡funciona!

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

El funcionamiento de su ejemplo de prueba:

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

impresiones:

1

Analice cada número por separado y compárelos de forma iterativa.

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

// fail here 

Evidentemente, no es un código de CF, pero se entiende.

+0

En realidad, es: D Eso es perfectamente válido CFScript (CF8 + o BD/Railo) allí mismo. :) –

0

Puede dividir la cadena que contiene la versión por puntos, luego comenzar en el primer índice y comparar hacia abajo hasta que uno sea mayor que el otro (o si son iguales, uno contiene un valor que el otro no).

Me temo que nunca he escrito en coldfusion, pero esa sería la lógica básica que seguiría.

Este es un ejemplo sin optimizar áspera:

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 número de versión es básicamente una matriz periodo delimitado de los números, por lo que puede analizar ambas versiones en matrices numéricas y, a continuación, comparar cada elemento de la primera matriz para el elemento correspondiente en la segunda matriz.

Para obtener la matriz, hacer:

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

y entonces usted puede hacer sus comparaciones.

0

No hay una forma general de convertir números de versión de varias piezas en números reales, si no hay restricciones en el tamaño de cada parte (por ejemplo, 4.702.0> 4.7.2?).

Normalmente se definir una función de comparación de costumbre mediante la creación de una secuencia o serie de version-number partes o componentes, de modo 4.7.2 se representa como [4, 7, 2] y 4.702.0 es [ 4, 702, 0]. A continuación, se compara cada elemento de las dos matrices hasta que no coinciden:

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 

No sé acerca de ColdFusion, pero en algunos idiomas se puede hacer una comparación directa con matrices o secuencias.Por ejemplo, en Python:

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

Si la versión 4 que realmente significa 4.0.0, y la versión 4.2 significa en realidad 4.2. 0, puede convertir fácilmente la versión a un número entero simple.

suponer que cada parte de la versión se encuentra entre 0 y 99, entonces se podría calcular una 'versión número entero' de XYZ como esto:

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

Si los intervalos son más grandes o más pequeños se puede utilizar factores de mayor o inferior a 100.

La comparación de la versión se vuelve fácil.

+1

En general, esta no es una mala idea, pero sí dijo específicamente, "el número de versión está fuera de mi control", lo que significa que el número de versión podría ser 2.454359043859043.6, con lo que su enfoque fallaría. –

Cuestiones relacionadas