2015-07-21 3 views
4

У меня есть две строки, которые мне нужно сравнить, но я хочу сравнить их осмысленно так, что, когда они являются числами, их фактическое значение следует сравнивать. До сих пор я попробовал следующее решение:Сравнение двух строк в Java

String str1 = "-0.6"; 
String str2 = "-.6"; 
if (NumberUtils.isNumber(str1) && NumberUtils.isNumber(str2)) { 
    Number num1 = NumberUtils.createNumber(str1); 
    Number num2 = NumberUtils.createNumber(str2); 
    System.out.println(num1.equals(num2)); 
} else { 
    System.out.println(str1.equals(str2)); 
} 

Это работает как и преобразуются в double с.
Но это не будет работать в этом случае, когда:

String str1 = "6"; 
String str2 = "6.0"; 

Есть ли простой способ сделать это, или мне придется написать свой собственный компаратор?

+0

И как вы действуете, когда одна строка не является чем-то вроде? – fge

+0

Не можете ли метод 'createNumber()' всегда возвращать 'Double' для чисел? – Codebender

+0

Это означает, что строка не предназначена для численных сравнений, таких как это. Вы должны пойти вместе, чтобы сравнить и сравнить их, как вы упомянули. – sakthisundar

ответ

3

Вместо использования общего назначения createNumber(String), заставить их double с использованием createDouble(String):

String str1 = "-0.6"; 
String str2 = "-.6"; 
if (NumberUtils.isNumber(str1) && NumberUtils.isNumber(str2)) { 
    Double d1 = NumberUtils.createDouble(str1); 
    Double d2 = NumberUtils.createDouble(str2); 
    System.out.println(d1.equals(d2)); 
} else { 
    System.out.println(str1.equals(str2)); 
} 
2

Вы можете, вероятно, использовать BigDecimal для этого:

final BigDecimal b1 = new BigDecimal(str1); 
final BigDecimal b2 = new BigDecimal(str2); 
return b1.compareTo(b2) == 0; 
+0

Почему большое десятичное число для таких меньших чисел, которые упоминаются в фрагменте кода? – sakthisundar

+0

Что происходит, если строка не является числом? – dsharew

+0

@DegenSharew Я упомянул, что первое, что в комментариях – fge

2

Вы можете использовать Double.parseDouble(String) вместо этого. Он выбрасывает NumberFormatException, который можно поймать, чтобы сообщить вам, что вы не должны сравнивать их как числа.

try { 
    Double d1 = Double.parseDouble(str1); 
    Double d2 = Double.parseDouble(str2); 

    //Now you have your doubles 
} catch (NumberFormatException e) 
{ 
    //Could not compare as numbers, do something else 
} 
2

Как было предложено на комментарий одной строки может быть number, а другой нет, или наоборот, или оба могут быть string так вместо того, чтобы проверить, если строки номер строки Я пойду с помощью try catch блока.

Как это:

try{ 
    Double d1 = Double.parseDouble(str1); 
    Double d2 = Double.parseDouble(str2); 
    System.out.println(d1.equals(d2)); 
}catch(NumberFormatException ex){ 

    System.out.println(num1.equals(num2)); 

} 

Это первые попытки сравнить их как числа, но если хотя бы один из них не является номером строки будет резервными для сравнения цепочек в catch блоке.

Смежные вопросы