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

时间:2015-07-21 06:29:51

标签: java string numbers double long-integer

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

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 个答案:

答案 0 :(得分:3)

不使用通用createNumber(String),而是使用createDouble(String)强制它们double

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

答案 1 :(得分:2)

您可以使用BigDecimal

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

答案 2 :(得分: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
}

答案 3 :(得分:2)

根据评论的建议,其中一个字符串可能是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

首先尝试将它们作为数字进行比较,但如果它们中至少有一个不是数字字符串,它将回退到$text = @" --=_alternative XXXXXXXXXXXXXX_= Content-Type: text/html; charset="KOI8-R" Content-Transfer-Encoding: base64 111111111111111111111111111111111111111111111111111111 --=_alternative XXXXXXXXXXXXXX_= Content-Type: text/html; charset="KOI8-R" Content-Transfer-Encoding: base64 222222222222222222222222222222222222222222222222222222 --=_alternative XXXXXXXXXXXXXX_=-- --=_related XXXXXXXXXXXXXX_=--_= Content-Type: image/jpeg Content-ID: <_2_XXXXXXXXXXXXXX> Content-Transfer-Encoding: base64 333333333333333333333333333333333333333333333333333333 --=_related XXXXXXXXXXXXXX_= Content-Type: image/jpeg Content-ID: <_2_XXXXXXXXXXXXXX> Content-Transfer-Encoding: base64 444444444444444444444444444444444444444444444444444444 --=_related XXXXXXXXXXXXXX_= Content-Type: image/jpeg Content-ID: <_2_XXXXXXXXXXXXXX> Content-Transfer-Encoding: base64 555555555555555555555555555555555555555555555555555555 --=_related XXXXXXXXXXXXXX_=-- "@ $regex1 = "(?ms).+?Content-Transfer-Encoding: base64(.+?)--=_alternative" $text1 = ([regex]::Matches($text,$regex1) | foreach {$_.groups[1].value}) Write-Host "text1 : " -fore red Write-Host $text1 #I want to get as output elements (of array, maybe, or one after another) #1). text between Content-Transfer-Encoding: base64 and --=_alternative, if there is above line Content-Type: text/html #this #1111111111111111111111111111111111111111111111111111111 #then this #2222222222222222222222222222222222222222222222222222222 $regex2 = "(?ms).+?Content-Transfer-Encoding: base64(.+?)--=_related" $text2 = ([regex]::Matches($text,$regex2) | foreach {$_.groups[1].value}) #I want to get as output elements (of array, maybe, or one after another) #2). text between Content-Transfer-Encoding: base64 and --=_related, if there is two lines above line Content-Type: image/jpeg #this #3333333333333333333333333333333333333333333333333333333 #then this #4444444444444444444444444444444444444444444444444444444 #then this #5555555555555555555555555555555555555555555555555555555 Write-Host "text2 : " -fore red Write-Host $text2 块中的字符串比较。