【问题标题】:Compare two strings meaningfully in Java在Java中有意义地比较两个字符串
【发布时间】:2015-07-21 06:29:51
【问题描述】:

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

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

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

【问题讨论】:

  • 当一个字符串不是某种数字时你会怎么做?
  • 你不能让createNumber() 方法总是返回Double 的数字吗?
  • 这意味着字符串不适用于诸如此类的数字比较。您应该使用 convrting to double 并按照您提到的那样比较它们。
  • 是否可以使用Number num1 = 0. + NumberUtils.createNumber(str1); 之类的方法解决? num2 也是如此。

标签: java string numbers double long-integer


【解决方案1】:

不要使用通用的createNumber(String),而是使用createDouble(String)强制他们到doubles:

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;
    

    【讨论】:

    • 为什么代码 sn-p 中提到的这么小的数字要大十进制?
    • 如果其中一个字符串不是数字会怎样?
    • @DegenSharew 我在 cmets 中提到了第一件事
    • @sakthisundar 因为精确;至少,BigDecimal 不会给您带来任何惊喜!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2016-01-03
        • 2012-06-19
        • 2012-02-08
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        相关资源
        最近更新 更多