Function Repository Resource:

VersionOrder

Source Notebook

Compare two version numbers to determine their order

Contributed by: Richard Hennigan (Wolfram Research)

ResourceFunction["VersionOrder"][ver1,ver2]

gives 1 if ver1 is before ver2 in version order, -1 if ver1 is after ver2 in version order and 0 if ver1 is the same version number as ver2.

Details and Options

The values for veri can be given as numbers or strings.
A version specified as "1.10" is interpreted as the tenth point release of version 1, which is distinctly greater than "1.1".
A version string can have any number of periods.
Trailing zeros are disregarded, so long as the preceding values are equivalent, e.g. "1.2" is considered the same version as "1.2.0".
Leading zeros are not disregarded, e.g. "0.1.2" is considered a lower version than "1.2".

Examples

Basic Examples (4) 

Compare version numbers:

In[1]:=
ResourceFunction["VersionOrder"]["1.1", "1.1.2"]
Out[1]=
In[2]:=
ResourceFunction["VersionOrder"]["1.0", "0.1.0"]
Out[2]=
In[3]:=
ResourceFunction["VersionOrder"]["1.5", "1.5.0"]
Out[3]=

Use numeric values:

In[4]:=
ResourceFunction["VersionOrder"][1.1, "1.1.0"]
Out[4]=
In[5]:=
ResourceFunction["VersionOrder"][1.1, 1.2]
Out[5]=
In[6]:=
ResourceFunction["VersionOrder"][2.1, "1.2"]
Out[6]=

Include letters:

In[7]:=
ResourceFunction["VersionOrder"]["1.1a", "1.1b"]
Out[7]=
In[8]:=
ResourceFunction["VersionOrder"]["1.1b", "1.1a"]
Out[8]=
In[9]:=
ResourceFunction["VersionOrder"]["1.1a", "1.1a"]
Out[9]=

Use the operator form:

In[10]:=
ResourceFunction["VersionOrder"]["1.0"][2]
Out[10]=

Scope (6) 

Trailing zeros are ignored in the comparison:

In[11]:=
ResourceFunction["VersionOrder"]["1.1", "1.1.0"]
Out[11]=
In[12]:=
ResourceFunction["VersionOrder"]["2.3", "2.3.0.0"]
Out[12]=

Preceding zeros change the interpretation:

In[13]:=
ResourceFunction["VersionOrder"]["1.1", "0.1.1"]
Out[13]=
In[14]:=
ResourceFunction["VersionOrder"]["0.5", "0.5.0"]
Out[14]=

Additional punctuation is ignored:

In[15]:=
ResourceFunction["VersionOrder"]["1. 2 ", "1.2"]
Out[15]=
In[16]:=
ResourceFunction["VersionOrder"]["3....5", "!3!.!5!"]
Out[16]=

Versions are case-sensitive:

In[17]:=
ResourceFunction["VersionOrder"]["1.0a", "1.0A"]
Out[17]=

Versions can have any number of parts:

In[18]:=
ResourceFunction["VersionOrder"]["1.2.3.4.5.6.7.8.9", "1.5"]
Out[18]=
In[19]:=
ResourceFunction[
 "VersionOrder"]["1.2.3.4.5.6.7.8.9", "1.2.3.4.5.6.7.8.0"]
Out[19]=

Numbers can be compared with strings:

In[20]:=
ResourceFunction["VersionOrder"][1.5, "1.5.0"]
Out[20]=

Applications (3) 

Create a function that tests if a version is greater than a given value:

In[21]:=
versionGreater[ver_] := NonNegative@*ResourceFunction["VersionOrder"][ver]
In[22]:=
releasedVersionQ = versionGreater["1.0"]
Out[22]=
In[23]:=
releasedVersionQ["2.0"]
Out[23]=
In[24]:=
releasedVersionQ["0.12"]
Out[24]=
In[25]:=
releasedVersionQ[1]
Out[25]=
In[26]:=
releasedVersionQ[Pi]
Out[26]=

Filter a list of versions:

In[27]:=
Select[{"3.2.4", 5.2, "1.3.3.7a", "1.33.7", Pi, "1.3", 1.2, "1.3.3.7b", "1.3.37", 2}, versionGreater[1.5]]
Out[27]=

Use the resource function PythonPackageList to get a list of Python packages, and then sort the packages by their version number with VersionOrder:

In[28]:=
Sort[ResourceFunction["PythonPackageList"][], ResourceFunction[
 "VersionOrder"]]
Out[28]=

Check paclet versions:

In[29]:=
pacletCheck[version_, name_] := NonNegative[
   ResourceFunction["VersionOrder"][version, Lookup[PacletInformation[name], "Version"]]];
In[30]:=
pacletCheck["1.2.22", "FunctionResource"]
Out[30]=
In[31]:=
pacletCheck[12, "CloudObject"]
Out[31]=
In[32]:=
pacletCheck[13, "CloudObject"]
Out[32]=

Properties and Relations (3) 

VersionOrder can be used as an ordering function in Sort:

In[33]:=
Sort[{"1.2.4", N[Pi], "1.3.3.7a", "1.33.7", Pi, "1.3", 1.2, "1.3.3.7b", "1.3.37", 2, "hello"}, ResourceFunction["VersionOrder"]]
Out[33]=

Use VersionOrder with Ordering:

In[34]:=
list = {"1.3.37b", "1.2.4", 1, "1.3.37a", "1.33.7", "1.3.37", 2}
Out[34]=
In[35]:=
order = Ordering[list, All, ResourceFunction["VersionOrder"]]
Out[35]=

Compare with Sort:

In[36]:=
list[[order]]
Out[36]=
In[37]:=
Sort[list, ResourceFunction["VersionOrder"]]
Out[37]=

VersionOrder works with OrderedQ:

In[38]:=
OrderedQ[{"1.1.5", 1.2, "2.3"}, ResourceFunction["VersionOrder"]]
Out[38]=

Compare to standard ordering:

In[39]:=
OrderedQ[{"1.1.5", 1.2, "2.3"}]
Out[39]=

Possible Issues (1) 

Strings with unrelated numbers and letters can have unexpected results:

In[40]:=
ver1 = CloudEvaluate[$Version]
Out[40]=
In[41]:=
ver2 = $Version
Out[41]=
In[42]:=
Sort[{ver1, ver2, "12.0.0"}, ResourceFunction["VersionOrder"]]
Out[42]=

Version History

  • 1.0.0 – 29 August 2019

Related Resources

License Information