Heisenberg
Heisenberg

Reputation: 5668

Compare two strings meaningfully in Java

I've two strings which I need to compare, but I want to compare them meaningfully such that when they are numbers their actual value should be compared. So far I've tried the following solution:

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));
}

This works as both are converted to doubles.
But this won't work in this case where:

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

Is there any easy way to do this, or will I have to write my own Comparator?

Upvotes: 4

Views: 218

Answers (4)

dsharew
dsharew

Reputation: 10675

As suggested on the comment one of the string could be a number and the other not or vice versa or both could be a string so instead of checking if the strings are number strings I will go using try catch block.

Like this:

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));

}

This first tries to compare them as numbers but if at least one of them is not a number string it will fallback to string comparison in the catch block.

Upvotes: 2

Mureinik
Mureinik

Reputation: 312257

Instead of using the general-purpose createNumber(String), force them to doubles using 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));
}

Upvotes: 3

milez
milez

Reputation: 2201

You could use Double.parseDouble(String) instead. It throws the NumberFormatException, which can be caught to inform you that you should not compare them as numbers.

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
}

Upvotes: 2

fge
fge

Reputation: 121840

You can probably use BigDecimal for this:

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

Upvotes: 2

Related Questions