2010-03-02 6 views
7

하나의 버전 번호가 다른 버전 번호보다 큰지 확인하고 싶습니다. 버전 번호는 다음 중 하나 일 수 있습니다 :버전 번호를 실제 번호로 구문 분석

4

4.2

4.22.2

4.2.2.233

... 버전 번호가 그대로 내 통제 범위를 넘어서서 실제로 얼마나 많은 점들이 그 수에 실제로 존재하는지 말할 수 없었다.

수가 실수가 정말 아니기 때문에, 나는 단순히 말할 수 없다,

Is 4.7 > 4.2.2 

나는 점검 할 수있는 실수로 4.2.2로, 같은 수를 변환하는 방법에 대한 갈 수있는 방법 다른 버전 번호에 대해?

필자는 ColdFusion 솔루션을 선호하지만, 기본 개념도 좋을 것입니다.

답변

6

이것은 Mango Blog에 플러그인 업데이트 코드에서 찢어, 그리고 약간의 업데이트됩니다. 그것은 당신이 원하는 것을 정확히 수행해야합니다. 인수 1이 큰 경우 1을, 인수 2가 큰 경우 -1을 반환하고 정확하게 일치하는 경우 0을 반환합니다. (4.0.1은 4.0.1.0과 정확하게 일치합니다.)

배열 대신 CF 목록 함수를 사용하므로 배열로 전환하면 성능이 약간 향상 될 수 있습니다. , 그것은 작동합니다!

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

은 예제 테스트 실행 :

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

인쇄 : 버전 4가 실제로 4.0.0 및 버전을 의미하는 경우

1

1

각 숫자를 별도로 구문 분석하고 반복적으로 비교하십시오.

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

// fail here 

분명히 CF 코드는 아니지만 아이디어를 얻을 수 있습니다.

+0

사실, 바로 그게 바로 CFScript (CF8 + 또는 BD/Railo)입니다. :) –

0

마침표로 버전이 포함 된 문자열을 분할 한 다음 첫 번째 색인에서 시작하여 하나가 다른 색인보다 크거나 비교할 때까지 비교할 수 있습니다 (또는 동일한 경우 다른 하나는 값을 포함하지 않음).

나는 coldfusion으로 작성한 적이 없지만 그 논리는 내가 따라야 할 기본 논리라고 생각합니다.

이 거친 최적화되지 않은 예입니다 : 당신이 숫자 배열로 두 버전을 모두 분석 한 다음에 첫 번째 배열의 각 요소를 비교할 수 있도록

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

버전 번호가 기본적으로 숫자의 기간으로 구분 된 배열입니다 두 번째 배열의 해당 요소

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

을 다음 당신은 당신의 비교를 수행 할 수 있습니다

배열을 얻으려면 않습니다.

0

각 부분의 크기에 제한이없는 경우 (예 : 4.702.0> 4.7.2?) 여러 부분으로 된 버전 번호를 실수로 변환하는 일반적인 방법은 없습니다.

가 보통은 부품 또는 성분, 그래서 4.7.2과 같이 표현되는 버전 번호의 순서 또는 배열을 생성함으로써 정의되는 비교 함수를 정의하는 것 [4, 7, 2] 4.702.0는 [이고 4, 702, 0].

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 

내가 ColdFusion에서 모르는,하지만 일부 언어는 배열이나 시퀀스와 직접 비교를 수행 할 수 있습니다 일치하지 않는 때까지 당신은 두 개의 배열의 각 요소를 비교합니다.예를 들어, 파이썬 :

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

4.2 실제로 4.2을 의미한다. 0이면 버전을 간단한 정수로 쉽게 변환 할 수 있습니다.

이 버전의 모든 부분은 0에서 99 사이에 있다고 가정하고이 같은 XYZ에서 '정수 버전'을 계산할 수 :

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

을 범위 요인이 높게 사용할 수 있습니다 크거나 작은 경우 또는 미만.

버전을 비교하면 쉽게됩니다.

+1

일반적으로 이것은 나쁜 생각은 아니지만 "버전 번호가 제 제어 범위를 벗어났습니다"라는 말은 구체적으로 말합니다. 이는 버전 번호가 2.454359043859043.6 일 수 있음을 의미합니다. –

관련 문제