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

4

我有两个字符串需要比较,但我希望进行有意义的比较,使得当它们是数字时,实际值应进行比较。到目前为止,我已经尝试了以下解决方案:

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

有没有简单的方法可以做到这一点,或者我必须编写自己的比较器(Comparator)?

当一个字符串不是某种类型的数字时,您该如何处理? - fge
你能不能让 createNumber() 方法始终返回数字的 Double 类型? - Codebender
这意味着字符串不适用于像这样的数字比较。您应该选择转换为double并按照您所提到的进行比较。 - sakthisundar
它是否可以使用类似于 Number num1 = 0. + NumberUtils.createNumber(str1); 的方式解决?对于 num2 也是一样的。 - skypjack
4个回答

3

不要使用通用的createNumber(String),而是强制使用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;

代码片段中为什么要使用BigDecimal处理这样小的数字? - sakthisundar
如果其中一个字符串不是数字会发生什么? - dsharew
@DegenSharew 我在评论中提到了这件事情。 - fge
@sakthisundar 因为精度问题;至少,使用 BigDecimal 不会有任何意外! - 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

如评论中所建议的,其中一个字符串可以是 数字,而另一个则不是或反之亦然,或者两个都是 字符串,因此我将使用 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块中回退到字符串比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接