在 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));
}
这是有效的,因为两者都被转换为 double
s。
但这在以下情况下不起作用:
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 double
s 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
块中的字符串比较。
我有两个字符串需要比较,但我想对它们进行有意义的比较,这样当它们是数字时,应该比较它们的实际值。到目前为止,我已经尝试了以下解决方案:
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";
有什么简单的方法可以做到这一点,还是我必须自己编写比较器?
你或许可以用 BigDecimal
来做这个:
final BigDecimal b1 = new BigDecimal(str1);
final BigDecimal b2 = new BigDecimal(str2);
return b1.compareTo(b2) == 0;
而不是使用通用的 createNumber(String)
, force them to double
s 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
块中的字符串比较。