2017-08-27 107 views
0

您好,我正在比较手机设备的版本号。如果一个版本以4.3.2的形式出现,我的程序崩溃了,所以我实现了十进制格式,但现在它只是将我的数字从4.3.2加到4.3,但是程序将会完全正常,例如4.2的版本号。我怎样才能修正我的比较器,以便能够取得3位小数,并且在仍然工作2位小数的同时不会崩溃。版本比较器3位小数

 @Override 
     public int compare(InventoryCardViewModel lhs, InventoryCardViewModel rhs) { 

      Phone lhp = phoneDataSource.getPhoneByDeviceID(lhs.getPhoneDeviceID.getValue()); 
      Phone rhp = phoneDataSource.getPhoneByDeviceID(rhs.getPhoneDeviceID.getValue()); 

      if(!lhp.versionNumber.equals(rhp.versionNumber)) { 
       DecimalFormat df = new DecimalFormat("#.#.#", new DecimalFormatSymbols(new Locale("en_US"))); 
       try { 
        lhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue()); 
        rhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue()); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
       if (Double.valueOf(lhp.versionNumber) > Double.valueOf(rhp.versionNumber)) { 
        return -1; 
       } else { 
        return 1; 
       } 
+0

不要使用'DecimalFormat';我可能会拆分“\\。”,并比较结果标记。 –

回答

0

正如我在评论中提到的,你不能因为Java十进制类型不支持小数的任意数目(也不能够任意精度的基本类型)使用DecimalFormat这里。相反,我会分割一个\\.,然后使用迭代来测试结果令牌。类似的,

public class VersionComparator implements Comparator<String> { 
    @Override 
    public int compare(String left, String right) { 
     /* Handle nulls. */ 
     if (left == null) { 
      if (right == null) { 
       return 0; 
      } 
      return -1; 
     } else if (right == null) { 
      return 1; 
     } 
     /* Generate tokens */ 
     String[] lTokens = left.split("\\."); 
     String[] rTokens = right.split("\\."); 

     int len = Math.max(lTokens.length, rTokens.length); 
     for (int i = 0; i < len; i++) { 
      /* Check if both sides still have tokens */ 
      if (i < lTokens.length && i < rTokens.length) { 
       int a = Integer.parseInt(lTokens[i]); 
       int b = Integer.parseInt(rTokens[i]); 

       if (a < b) { 
        return -1; 
       } else if (a > b) { 
        return 1; 
       } 
      } else if (i < rTokens.length) { 
       /* No more tokens on the left hand side */ 
       return -1; 
      } else { 
       /* No more tokens on the right hand side */ 
       return 1; 
      } 
     } 
     return 0; 
    } 
} 
0
int compareVersions(String v1, String v2) { 
    final String[] split1 = v1.split("[.]"); 
    final String[] split2 = v2.split("[.]"); 

    for (int i = 0; i < split1.length; i++) { 
     if (i < split2.length) { 
      final int compare = Integer.valueOf(split1[ i ]) 
             .compareTo(Integer.valueOf(split2[ i ])); 

      if (compare != 0) { 
       return compare; 
      } 
     } 
     else { 
      return 1; 
     } 
    } 

    return split1.length == split2.length ? 0 : -1; 
}