将版本号解析为实数

时间:2010-03-02 19:05:13

标签: coldfusion version

我想确定一个版本号是否大于另一个版本号。版本号可以是以下任何一种:

  

4

     

4.2

     

4.22.2

     

4.2.2.233

...因为版本号超出了我的控制范围,所以我不能说数字中实际存在多少个点。

由于这个数字不是真正的数字,我不能简单地说,

Is 4.7 > 4.2.2

如何将4.2.2之类的数字转换为可以根据其他版本号检查的实数?

我最好喜欢ColdFusion解决方案,但基本概念也没问题。

6 个答案:

答案 0 :(得分: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>

打印:

  

1

答案 1 :(得分:3)

如果版本4实际上意味着4.0.0,而版本4.2实际上意味着4.2.0,则可以轻松地将版本转换为简单整数。

假设版本的每个部分都在0到99之间,那么你可以像这样从X.Y.Z计算一个“整数版本”:

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

如果范围更大或更小,您可以使用高于或低于100的因子。

比较版本然后变得容易。

答案 2 :(得分:1)

分别解析每个数字并迭代比较它们。

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

// fail here

这显然不是CF代码,但你明白了。

答案 3 :(得分:1)

版本号基本上是一个以句点分隔的数字数组,因此您可以将两个版本解析为数字数组,然后将第一个数组中的每个元素与第二个数组中的相应元素进行比较。

要获取数组,请执行:

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

然后你可以进行比较。

答案 4 :(得分:0)

您可以按句点拆分包含版本的字符串,然后从第一个索引开始比较,直到一个大于另一个(或者如果它们相等,则一个包含另一个不包含的值)。

我担心我从未写过冷血,但这将是我遵循的基本逻辑。

这是一个粗略的未经优化的例子:

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

答案 5 :(得分: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,但在某些语言中,您可以直接与数组或序列进行比较。例如,在Python中:

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