2017-08-27 80 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; 
}