从字符串中获取多位小数

getting a multi decimal number from a string

对于我的一个项目,我想从具有多个小数位的字符串中获取一个版本,是否可以将其转换为多位小数点双精度数还是不可能。我想用这个看看是不是比上一个还要多位小数

我目前使用的是 if (!vers.equalsIgnoreCase(plugin.getDescription().getVersion())) { // Do stuff 但我想做到,这样我就可以做到 if (vers > plugin.getDescription().getVersion()) { // do stuff vers 等于 1.0.1,plugin.getDescription().getVersion() 等于 1.0.2

谢谢!

String[] numbers = version.split(".");
String[] numbers2 = version2.split(".");
int index = numbers.length-1;
while(numbers[index] != "."){
     index--;
}
String lastnumber = version.substring(index+1, numbers.length];
index = numbers2.length-1;
while(numbers2[index] != "."){
     index--;
}
String lastnumber2 = version.substring(index+1, numbers2.length];
if(lastnumber > lastnumber2){
    //later version
}else{
   //use the same thing to check the other numbers
}

看来您想比较版本。或者根据一些字符串表示的版本做出决定。如果 plugin.getDescription().getVersion()String,那么您应该能够使用简单的 String 比较来确定版本之间的顺序。这样的事情应该有效:

String pluginVersion=plugin.getDescription().getVersion();
if (ensureValidVersion(pluginVersion) 
     && compareVersions(vers,pluginVersion)>0) {
  // do staff is vers is greater then plugin version
} 

ensureValidVersion 方法将验证您是否具有有效的版本号表示。 compareVersions 会对每个版本子组件进行比较。

如果你假设所有部分都是数字,你可以这样实现。

public static int compareVersions(String vers1, String vers2) {
    String[] v1 = vers1.split("\.");
    String[] v2 = vers2.split("\.");
    for (int i = 0; i < v1.length && i < v2.length; i++) {
        int i1 = Integer.parseInt(v1[i]);
        int i2 = Integer.parseInt(v2[i]);
        int cmp = Integer.compare(i1, i2);
        if (cmp != 0)
            return cmp;
    }
    return Integer.compare(v1.length, v2.length);
}

System.out.println(compareVersions("1.0.1", "1.0.2"));
System.out.println(compareVersions("1.0.1", "1.0"));
System.out.println(compareVersions("1.0.2", "1.0.10"));

打印

-1
1
-1

更复杂的版本支持字母内嵌版本

public static int compareVersions(String vers1, String vers2) {
    String[] v1 = vers1.split("\.");
    String[] v2 = vers2.split("\.");
    for (int i = 0; i < v1.length && i < v2.length; i++) {
        String [] w1 = v1[i].split("(?<=\D)(?=\d)|(?<=\d)(?=\D)");
        String [] w2 = v2[i].split("(?<=\D)(?=\d)|(?<=\d)(?=\D)");
        for(int j=0;j<w1.length&&j<w2.length;j++) {
            try {
                int i1 = Integer.parseInt(w1[j]);
                int i2 = 0;
                try {
                    i2 = Integer.parseInt(w2[j]);
                } catch (NumberFormatException e) {
                    return -1;
                }
                int cmp = Integer.compare(i1, i2);
                if (cmp != 0)
                    return cmp;
            } catch (NumberFormatException e) {
                try {
                    Integer.parseInt(w2[j]);
                    return +1;
                } catch (NumberFormatException e1) {
                    int cmp = w1[j].compareTo(w2[j]);
                    if (cmp != 0)
                        return cmp;
                }
            }
        }
        int cmp = Integer.compare(w1.length, w2.length);
        if (cmp != 0)
            return cmp;
    }
    return Integer.compare(v1.length, v2.length);
}

System.out.println(compareVersions("1.0.2", "1.0.2a"));
System.out.println(compareVersions("1.0.2b", "1.0.2a"));
System.out.println(compareVersions("1.8.0_66", "1.8.0_65"));
System.out.println(compareVersions("1.7.0_79", "1.8.0_65"));

打印

-1
1
1
-1

假设您有以下形式的版本号:x.y.z
您可以使用 Viacheslav Vedenin 建议的类似方法:

String versionNumber = "1.3.45";
String[] singleParts = versionNumbers.split(".");

int[] versionParts = new int[singleParts.length];
for(int i=0; i<singleParts.length; i++) {
    versionParts[i] = Integer.parseInt(singleParts[i]);
}

现在你有了版本号的单个部分的数组。要将它与之前的进行比较,您可以执行以下操作:

public static boolean isGreater(int[] firstVersion, int[] secondVersion) {
    if(secondVersion.length > firstVersion.length) {
        return false;
    }else {
        if(firstVersion.length > secondVersion.length) {
            return true;
        }else {
            for(int k=0; k< firstVersion.length; k++) {
                int v1 = firstVersion[k];
                int v2 = secondVersion[k];

                if(v1 < v2) {
                    return true;
                }
            }
            return false;
        }
    }
}

如果您想使用 equality/inequality 运算符(==<><=>= 来比较版本), 你有两个选择。

  1. 使用像 C++ 这样支持运算符重载的语言
  2. major.minor.build中的每个字符串设置长度限制,并在比较它们之前将每个版本转换为整数。例如,如果它们每个的限制是 3(即你可以拥有的最长版本是 abc.def.ghi),那么你可以只使用 build + minor * 10^3 + major * 10^6.

或者,您可以只实施 Comparable<Version> 并获得一个不错的 OOP 解决方案。

public class Example {
    static class Version implements Comparable<Version> {
        private int major;
        private int minor;
        private int build;

        public Version(String s) {
            final String[] split = s.split("\.");
            major = Integer.parseInt(split[0]);
            minor = Integer.parseInt(split[1]);
            build = Integer.parseInt(split[2]);
        }

        public int getMajor() {
            return major;
        }

        public int getMinor() {
            return minor;
        }

        public int getBuild() {
            return build;
        }

        @Override
        public int compareTo(Version v) {
            if (getMajor() < v.getMajor()) {
                return -1;
            } else if (getMajor() > v.getMajor()) {
                return 1;
            } else {
                if (getMinor() < v.getMinor()) {
                    return -1;
                } else if (getMinor() > v.getMinor()) {
                    return 1;
                } else {
                    if (getBuild() < v.getBuild()) {
                        return -1;
                    } else if (getBuild() > v.getBuild()) {
                        return 1;
                    } else {
                        return 0;
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        String s1 = "1.0.1";
        String s2 = "1.0.2";
        compare(s1, s2);
        compare(s1, s1);
        compare(s2, s2);
        compare(s2, s1);
    }

    private static void compare(String s1, String s2) {
        Version v1 = new Version(s1);
        Version v2 = new Version(s2);
        final int compareTo = v1.compareTo(v2);
        if (compareTo == -1) {
            System.out.println(s1 + " was released before " + s2);
        } else if (compareTo == 0) {
            System.out.println(s1 + " is the same as " + s2);
        } else {
            System.out.println(s1 + " was released after " + s2);
        }
    }
}

输出:

1.0.1 was released before 1.0.2
1.0.1 is the same as 1.0.1
1.0.2 is the same as 1.0.2
1.0.2 was released after 1.0.1