Сравните две строки по смыслу в 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));
}

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

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

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

4 ответа

Решение

Вместо использования общего назначения 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));
}

Вы могли бы использовать 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
}

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

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

Как указано в комментарии, одна из строк может быть 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 блок.

Другие вопросы по тегам