在 Java 中有意义地比较两个字符串

Compare two strings meaningfully in 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";

有什么简单的方法可以做到这一点,还是我必须自己编写比较器?

你或许可以用 BigDecimal 来做这个:

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

而不是使用通用的 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));
}

您可以改用 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
}

正如评论中所建议的那样,其中一个字符串可以是 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 块中的字符串比较。