Сравните две строки по смыслу в 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
s.
Но это не сработает в этом случае, когда:
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
блок.