我需要比较两个字符串,但我想对它们进行有意义的比较,这样当它们是数字时,它们的实际值应该进行比较。到目前为止,我已经尝试了以下解决方案:
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";
有没有简单的方法可以做到这一点,还是我必须编写自己的比较器?
答案 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
块中的字符串比较。