Aaaaaa1212
Aaaaaa1212

Reputation: 39

Comparison of app version

How to compare app version in android

I got latest version code and current version code , but the problem is

current version is 1.0

and latest version is 1.0.0

so how to compare that float value in android

Upvotes: 2

Views: 7359

Answers (4)

M. Wojcik
M. Wojcik

Reputation: 2569

Why overcomplicate this so much? Just scale the major, minor, patch version and you have it covered:

fun getAppVersionFromString(version: String): Int { // "2.3.5"
    val versions = version.split(".") // [2, 3, 5]
    val major = versions[0].toIntOrDefault(0) * 10000 // 20000
    val minor = versions[1].toIntOrDefault(0) * 1000 // 3000
    val patch = versions[2].toIntOrDefault(0) * 100 // 500
    return major + minor + patch // 2350
}

That way when you compare e.g 9.10.10 with 10.0.0 the second one is greater.

Upvotes: 1

Kishan Solanki
Kishan Solanki

Reputation: 14618

I am a bit late to the party but I have a great solution for all of you!

1. Use this class:

public class VersionComparator implements Comparator {

public boolean equals(Object o1, Object o2) {
    return compare(o1, o2) == 0;
}

public int compare(Object o1, Object o2) {
    String version1 = (String) o1;
    String version2 = (String) o2;

    VersionTokenizer tokenizer1 = new VersionTokenizer(version1);
    VersionTokenizer tokenizer2 = new VersionTokenizer(version2);

    int number1, number2;
    String suffix1, suffix2;

    while (tokenizer1.MoveNext()) {
        if (!tokenizer2.MoveNext()) {
            do {
                number1 = tokenizer1.getNumber();
                suffix1 = tokenizer1.getSuffix();
                if (number1 != 0 || suffix1.length() != 0) {
                    // Version one is longer than number two, and non-zero
                    return 1;
                }
            }
            while (tokenizer1.MoveNext());

            // Version one is longer than version two, but zero
            return 0;
        }

        number1 = tokenizer1.getNumber();
        suffix1 = tokenizer1.getSuffix();
        number2 = tokenizer2.getNumber();
        suffix2 = tokenizer2.getSuffix();

        if (number1 < number2) {
            // Number one is less than number two
            return -1;
        }
        if (number1 > number2) {
            // Number one is greater than number two
            return 1;
        }

        boolean empty1 = suffix1.length() == 0;
        boolean empty2 = suffix2.length() == 0;

        if (empty1 && empty2) continue; // No suffixes
        if (empty1) return 1; // First suffix is empty (1.2 > 1.2b)
        if (empty2) return -1; // Second suffix is empty (1.2a < 1.2)

        // Lexical comparison of suffixes
        int result = suffix1.compareTo(suffix2);
        if (result != 0) return result;

    }
    if (tokenizer2.MoveNext()) {
        do {
            number2 = tokenizer2.getNumber();
            suffix2 = tokenizer2.getSuffix();
            if (number2 != 0 || suffix2.length() != 0) {
                // Version one is longer than version two, and non-zero
                return -1;
            }
        }
        while (tokenizer2.MoveNext());

        // Version two is longer than version one, but zero
        return 0;
    }
    return 0;
}

// VersionTokenizer.java
public static class VersionTokenizer {
    private final String _versionString;
    private final int _length;

    private int _position;
    private int _number;
    private String _suffix;
    private boolean _hasValue;

    VersionTokenizer(String versionString) {
        if (versionString == null)
            throw new IllegalArgumentException("versionString is null");

        _versionString = versionString;
        _length = versionString.length();
    }

    public int getNumber() {
        return _number;
    }

    String getSuffix() {
        return _suffix;
    }

    public boolean hasValue() {
        return _hasValue;
    }

    boolean MoveNext() {
        _number = 0;
        _suffix = "";
        _hasValue = false;

        // No more characters
        if (_position >= _length)
            return false;

        _hasValue = true;

        while (_position < _length) {
            char c = _versionString.charAt(_position);
            if (c < '0' || c > '9') break;
            _number = _number * 10 + (c - '0');
            _position++;
        }

        int suffixStart = _position;

        while (_position < _length) {
            char c = _versionString.charAt(_position);
            if (c == '.') break;
            _position++;
        }

        _suffix = _versionString.substring(suffixStart, _position);

        if (_position < _length) _position++;

        return true;
    }
}

}

2. create this function

    private fun isNewVersionAvailable(currentVersion: String, latestVersion: String): Boolean {
    val versionComparator = VersionComparator()
    val result: Int = versionComparator.compare(currentVersion, latestVersion)
    var op = "=="
    if (result < 0) op = "<"
    if (result > 0) op = ">"
    System.out.printf("%s %s %s\n", currentVersion, op, latestVersion)
    return if (op == ">" || op == "==") {
        false
    } else op == "<"
}

3. and just call it by

e.g. isNewVersionAvailable("1.2.8","1.2.9") where 1.2.8 is your current version here and 1.2.9 is the latest version, which returns true!

Upvotes: 1

G00fY
G00fY

Reputation: 5297

I have written a small Android library for comparing version numbers: https://github.com/G00fY2/version-compare

What it basically does is this:

  public int compareVersions(String versionA, String versionB) {
    String[] versionTokensA = versionA.split("\\.");
    String[] versionTokensB = versionB.split("\\.");
    List<Integer> versionNumbersA = new ArrayList<>();
    List<Integer> versionNumbersB = new ArrayList<>();

    for (String versionToken : versionTokensA) {
      versionNumbersA.add(Integer.parseInt(versionToken));
    }
    for (String versionToken : versionTokensB) {
      versionNumbersB.add(Integer.parseInt(versionToken));
    }

    final int versionASize = versionNumbersA.size();
    final int versionBSize = versionNumbersB.size();
    int maxSize = Math.max(versionASize, versionBSize);

    for (int i = 0; i < maxSize; i++) {
      if ((i < versionASize ? versionNumbersA.get(i) : 0) > (i < versionBSize ? versionNumbersB.get(i) : 0)) {
        return 1;
      } else if ((i < versionASize ? versionNumbersA.get(i) : 0) < (i < versionBSize ? versionNumbersB.get(i) : 0)) {
        return -1;
      }
    }
    return 0;
  }

This snippet doesn't offer any error checks or handling. Beside that my library also supports suffixes like "1.2-rc" > "1.2-beta".

Upvotes: 2

Amsheer
Amsheer

Reputation: 7131

Use the following method to compare the versions number:

Convert float to String first.

public static int versionCompare(String str1, String str2) {
    String[] vals1 = str1.split("\\.");
    String[] vals2 = str2.split("\\.");
    int i = 0;
    // set index to first non-equal ordinal or length of shortest version string
    while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
      i++;
    }
    // compare first non-equal ordinal number
    if (i < vals1.length && i < vals2.length) {
        int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
        return Integer.signum(diff);
    }
    // the strings are equal or one string is a substring of the other
    // e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
    return Integer.signum(vals1.length - vals2.length);
}

Refer the following SO question : Efficient way to compare version strings in Java

Upvotes: 0

Related Questions